Início rápido com Hive

MySQLBeginner
Pratique Agora

Introdução

Este laboratório aborda a configuração e as operações básicas do Hive. Ele foi desenvolvido para estudantes com conhecimentos básicos de SQL que desejam entender a arquitetura, a implantação básica e o uso do Hive.

Digite você mesmo todos os exemplos de código deste documento, em vez de apenas copiar e colar. Assim, você vai se familiarizar melhor com o código. Se tiver algum problema, consulte a documentação com atenção ou peça ajuda e troque ideias no fórum.

Introdução ao Hive

Nesta etapa, você vai aprender como o Apache Hive oferece uma interface SQL para consultar e analisar grandes conjuntos de dados armazenados no Hadoop. A seguir, veja uma visão geral da arquitetura e dos principais recursos do Hive:

Arquitetura do Hive

  • Componentes: o Hive inclui o HCatalog, usado para gerenciar tabelas e armazenamento, e o WebHCat, usado para executar tarefas MapReduce, consultas Pig ou interagir com os metadados do Hive por meio de uma API REST.
  • Recursos:
    • Oferece suporte a consultas SQL para tarefas de data warehouse, como ETL, análise de dados e geração de relatórios.
    • Os dados ficam armazenados em sistemas como HDFS ou HBase; as consultas são executadas por mecanismos de processamento, como Tez, Spark ou MapReduce.
    • Oferece suporte a linguagens procedurais, HPL-SQL e consultas aninhadas, com suporte do Hive LLAP, YARN e Slider.

Unidades básicas de dados no Hive

  • Banco de dados: espaço de nomes que evita conflitos de nomes e aumenta a segurança.
  • Tabela: unidade de dados homogêneos com o mesmo esquema. Por exemplo, a tabela page_views pode ter colunas como timestamp, userid e page_url.
  • Partição: divide os dados em partições com base em chaves, facilitando a recuperação eficiente dos dados.
  • Bucket: divide os dados particionados em buckets com base em valores de uma função hash, melhorando a eficiência das consultas.

Tipos de dados do Hive

O Hive foi desenvolvido para tarefas de data warehouse, e não para processamento de transações online (OLTP). Seu foco está em escalabilidade, desempenho, confiabilidade e tolerância a falhas. Ele oferece suporte a vários formatos de entrada e pode ser ampliado com conectores para diferentes formatos. Entender a arquitetura, as unidades de dados e os tipos de dados do Hive é essencial para aproveitar seus recursos em análises de Big Data.

Instalação e implantação do Hive

Nesta etapa, você vai conhecer a instalação e a implantação do Hive, incluindo a estrutura de diretórios, as variáveis de ambiente, o metastore e os parâmetros do sistema.

Primeiro, mude para o usuário hadoop para realizar as próximas operações. Na área de trabalho, clique duas vezes para abrir o terminal do Xfce e digite o comando a seguir:

su - hadoop

Dica: a senha do usuário hadoop é hadoop.

Em seguida, use o comando wget para baixar uma versão estável do Hive. Neste laboratório, usamos a versão 2.3.3:

sudo wget https://labexfile.oss-us-west-1.aliyuncs.com/courses/144/apache-hive-2.3.3-bin.tar.gz

Agora, extraia o pacote de instalação baixado. Digite o seguinte comando no terminal:

tar -zxvf apache-hive-2.3.3-bin.tar.gz

Use o sudo para mover o diretório extraído para /opt. Sem o sudo, talvez você não tenha permissão para gravar nesse diretório:

sudo mv /home/hadoop/apache-hive-2.3.3-bin /opt/hive-2.3.3

Depois de mover o diretório, defina o usuário e o grupo proprietários do diretório do Hive como hadoop. Digite o seguinte comando no terminal:

sudo chown -R hadoop:hadoop /opt/hive-2.3.3

Dica: você pode abrir outro terminal para executar as operações acima com privilégios de sudo.

labex:~/ $ ls -al /opt/
total 24
drwxrwxr-x 10 hadoop hadoop 4096 Mar 3 12:01 hive-2.3.3
...

Configuração das variáveis de ambiente

Nesta etapa, você vai configurar as variáveis de ambiente do Hive para que HIVE_HOME aponte para o diretório de instalação.

Primeiro, abra o arquivo .bashrc do usuário hadoop com o editor vim. Digite o seguinte comando no terminal:

vim /home/hadoop/.bashrc

Adicione o conteúdo a seguir ao final do arquivo. Ajuste o valor de PATH de acordo com o ambiente deste laboratório. A expressão $PATH mantém o conteúdo existente. Adicione :$HIVE_HOME/bin ao final da variável de ambiente PATH:

export HIVE_HOME=/opt/hive-2.3.3
export PATH=$PATH:$HIVE_HOME/bin

Quando terminar, salve o arquivo e saia do editor. Em seguida, use o comando source para ativar as variáveis de ambiente acima.

Neste laboratório, o Hive já está pré-instalado, por isso você não precisa carregar as variáveis de ambiente com source. Em uma instalação própria, essa etapa depende do ambiente.

Configuração

Nesta etapa, você vai revisar a configuração pré-instalada do Hive e criar os arquivos de configuração necessários para as verificações.

Configuração do metastore

Antes de usar o Hive, configure o armazenamento de metadados. Por padrão, o Hive armazena os metadados em um banco de dados Derby incorporado. O local dos arquivos no disco é definido pela configuração javax.jdo.option.ConnectionURL, no arquivo de configuração do Hive conf/hive-default.xml. Por padrão, esse local é ./metastore_db.

Neste laboratório, porém, usaremos o MySQL para armazenar os metadados. Por isso, você precisa modificar o arquivo de configuração do Hive.

Crie e abra com o editor vim o arquivo de configuração usado neste laboratório:

vim /opt/hive-2.3.3/conf/hive-site.xml
<configuration>
<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://localhost:3306/hive_metastore1?createDatabaseIfNotExist=true</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>hiveuser1</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>123qweQWE...</value>
</property>
</configuration>

Depois de editar os itens de configuração acima, salve o arquivo e saia do editor.

Criar o banco de dados MySQL

Inicie o servidor MySQL com sudo mysql e crie o banco de dados hive_metastore:

CREATE DATABASE hive_metastore1;
CREATE USER 'hiveuser1'@'localhost' IDENTIFIED BY '123qweQWE...';
GRANT ALL PRIVILEGES ON hive_metastore1.* TO 'hiveuser1'@'localhost';
FLUSH PRIVILEGES;
exit;

Em seguida, baixe o driver JDBC do MySQL e copie-o para o diretório /opt/hive-2.3.3/lib:

cp /usr/local/hive/lib/mysql-connector-j-8.3.0.jar /opt/hive-2.3.3/lib

Configurar os parâmetros do sistema do Hive

Depois de configurar o metastore, defina os itens de configuração internos do Hive para informar o local do Hadoop, o caminho dos arquivos de configuração internos e outros parâmetros.

Primeiro, use o comando cp para copiar o modelo de configuração e ativá-lo.

Digite o seguinte comando no terminal:

cp /opt/hive-2.3.3/conf/hive-env.sh.template /opt/hive-2.3.3/conf/hive-env.sh

Em seguida, abra o arquivo hive-env.sh com o editor vim:

vim /opt/hive-2.3.3/conf/hive-env.sh

Na linha 48, defina HADOOP_HOME como o caminho de instalação do Hadoop:

HADOOP_HOME=/home/hadoop/hadoop

Depois de editar os itens de configuração acima, salve o arquivo e saia do editor.

Inicializar o metastore

Nesta etapa, você vai inicializar o metastore do Hive e iniciar os serviços do Hadoop de que o Hive precisa.

Como os dados usados nas próximas etapas serão armazenados no HDFS, inicie o HDFS antes de continuar. Digite os comandos a seguir no terminal:

start-dfs.sh
start-yarn.sh

Digite jps para verificar o status dos serviços:

hadoop:~/ $ jps                                                      [17:31:43]
8960 Jps
3153 NodeManager
2823 SecondaryNameNode
3017 ResourceManager
2570 DataNode
2428 NameNode

Se esta for a primeira vez que você usa o Hadoop, será necessário excluir os dados do Hadoop e inicializá-lo com hdfs namenode -format.

Neste laboratório, o Hive pré-instalado foi inicializado com o banco de dados acima. Se quiser inicializar o Hive que acabou de baixar, use o comando a seguir:

/opt/hive-2.3.3/bin/schematool -initSchema -dbType mysql
Initialization script completed
schemaTool completed

Se você inicializar o Hive que acabou de baixar, altere o caminho de HIVE_HOME em ~/.bashrc para o caminho da instalação e execute source para carregar a configuração. No entanto, recomendamos que você não faça isso, pois os testes de Hive das próximas etapas usam o Hive pré-instalado.

Quando a mensagem indicar que a inicialização foi concluída, você poderá usar o comando hive para abrir a linha de comando do Hive. Digite o comando a seguir no terminal:

hive

Dica: se você digitar hive diretamente no shell do Hive pré-instalado, use o caminho absoluto para abrir o shell da instalação que acabou de configurar.

Hive Session ID = 3eee2693-175d-4452-82d2-47f1b639d9d5

Logging initialized using configuration in jar:file:/usr/local/hive/lib/hive-common-3.1.3.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Hive Session ID = 68d0d345-92c3-4eb1-8393-7ee34f56363f
hive>

Operações básicas do Hive

Nesta etapa, você vai aprender a realizar operações básicas com tabelas do Hive. Você também pode consultar todas as instruções do Hive no Manual de linguagem.

Criar uma tabela

Primeiro, obtenha alguns dados. Os dados desta parte do laboratório são um arquivo de log que simula um servidor NginX e pode ser usado para analisar as visualizações de páginas de um site.

Abra outro terminal e digite os comandos a seguir:

su hadoop
cd ~
wget http://labfile.oss-cn-hangzhou.aliyuncs.com/courses/567/log_example.csv

Em seguida, envie o arquivo para o HDFS:

hdfs dfs -mkdir -p /user/data/staging/page_view
hdfs dfs -put /home/hadoop/log_example.csv /user/data/staging/page_view

Depois de obter os dados, crie uma tabela para armazená-los. Para criar a tabela page_view com esses dados, digite a instrução a seguir na linha de comando do Hive:

CREATE TABLE page_view(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
STORED AS SEQUENCEFILE;

Neste exemplo, cada coluna da tabela tem um tipo de dado adequado. Você também pode adicionar comentários às colunas e à tabela. Além disso, a cláusula PARTITIONED BY define colunas de partição diferentes das colunas de dados. As colunas de partição não são armazenadas junto com as colunas de dados. Quando você especifica colunas de partição dessa forma, o caractere de nova linha é usado como separador entre as linhas.

Se os dados não estiverem no formato acima, você poderá definir o separador de campos como no exemplo a seguir:

A instrução a seguir serve apenas como demonstração. Não a digite no shell do hive.

CREATE TABLE page_view1(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
STORED AS SEQUENCEFILE;

O separador de linhas é definido pelo separador do sistema Hadoop, não pelo Hive. Portanto, não é possível alterar manualmente esse separador.

Em geral, os dados da tabela são armazenados em buckets, o que facilita a amostragem eficiente do conjunto de dados durante as consultas. Sem buckets, mesmo que seja possível fazer uma amostragem aleatória da tabela, não se obtém uma amostragem eficiente ao percorrer todos os dados. O exemplo a seguir mostra como habilitar o armazenamento em buckets na coluna userid da tabela page_view.

A instrução a seguir serve apenas como demonstração. Não a digite no shell do hive.

CREATE TABLE page_view2(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
COLLECTION ITEMS TERMINATED BY '2'
MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;

No exemplo acima, a coluna userid é distribuída em 32 buckets por meio de uma função hash. Em cada bucket, os dados são ordenados de forma crescente por viewTime. Essa organização permite fazer amostragens eficientes das colunas agrupadas — neste caso, userid. A ordenação também ajuda quem gerencia os dados a avaliar consultas com mais eficiência, graças a estruturas de dados melhores.

A instrução a seguir serve apenas como demonstração. Não a digite no shell do hive.

CREATE TABLE page_view3(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Friends ARRAY<BIGINT>, properties MAP<STRING, STRING>,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
COLLECTION ITEMS TERMINATED BY '2'
MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;

No exemplo acima, o formato de cada linha da tabela é definido com nomes de campos e tipos, de modo semelhante às definições de tipos usadas em outras linguagens de programação. Os nomes das tabelas e das colunas não diferenciam maiúsculas de minúsculas. O texto IP Address of the User e a cláusula COMMENT mostram que é possível adicionar comentários tanto às colunas quanto à tabela. Além disso, a cláusula PARTITIONED BY define colunas de partição diferentes das colunas de dados. Como mencionado anteriormente, essas colunas não armazenam os dados. A cláusula CLUSTERED BY especifica a coluna usada para criar os buckets e a quantidade deles. A cláusula ROW FORMAT DELIMITED define como as linhas são armazenadas em uma tabela do Hive. Para formatos delimitados, essa cláusula especifica os separadores dos campos, dos itens de uma coleção (array ou map) e das chaves de um map. Os números usados são codificados em ASCII. STORED AS SEQUENCEFILE indica que os dados são armazenados no HDFS em formato binário, especificamente no tipo SequenceFile do Hadoop. As configurações das cláusulas ROW FORMAT e STORED AS são os valores padrão usados atualmente pelo Hive. Por isso, elas não foram especificadas na instrução inicial de criação da tabela.

Consultar tabelas e partições

Para listar as tabelas existentes no seu data warehouse, use a instrução a seguir:

SHOW TABLES;

Se houver muitas tabelas, a instrução acima retornará muitas linhas. Você pode restringir a lista especificando um prefixo. Por exemplo, para listar as tabelas cujo nome começa com page, use a instrução a seguir:

SHOW TABLES 'page.*';

A correspondência segue a sintaxe de expressões regulares. O ponto (.) funciona como caractere curinga.

Para listar as partições de uma tabela, use a instrução a seguir. Se a tabela não for particionada, nenhum resultado será retornado:

SHOW PARTITIONS page_view;

Para listar as colunas de uma tabela e seus tipos, use a instrução DESCRIBE:

DESCRIBE page_view;

Para listar as colunas e todas as outras propriedades da tabela, adicione a palavra-chave EXTENDED. Essa instrução exibe muitas informações e costuma ser usada para depuração:

DESCRIBE EXTENDED page_view;

Modificar uma tabela

Para renomear uma tabela existente, use a instrução ALTER TABLE com RENAME TO. Se já houver uma tabela com o novo nome, o Hive retornará um erro. As instruções a seguir são apenas exemplos: não as execute, pois a próxima etapa usa a tabela page_view que você criou.

ALTER TABLE page_view RENAME TO new_page_view;

Veja o resultado:

hive> ALTER TABLE page_view RENAME TO new_page_view;
OK
Time taken: 0.124 seconds
hive> show tables;
OK
new_page_view
...
Time taken: 0.021 seconds, Fetched: 4 row(s)

Também é possível renomear as colunas de uma tabela existente. Porém, é importante usar o mesmo tipo de coluna e incluir um registro em cada uma das colunas existentes:

ALTER TABLE new_page_view REPLACE COLUMNS (viewTime INT, userid BIGINT, page_url STRING, referrer_url STRING, ipaddr STRING COMMENT 'IP Address of the User');

Além disso, você pode adicionar novas colunas a uma tabela existente:

ALTER TABLE new_page_view ADD COLUMNS (new_column INT COMMENT 'a new int column');

As alterações no esquema, como a adição de uma coluna, preservam o esquema da partição antiga da tabela. Assim, ela não se torna uma tabela particionada. Todas as consultas que acessam essas colunas na partição antiga retornam implicitamente valores nulos ou os valores padrão especificados para essas colunas.

Excluir tabelas e partições

Como o Hive foi desenvolvido para funcionar como um data warehouse, excluir dados é uma operação que deve ser evitada. Por isso, a exclusão de tabelas é um pouco trabalhosa. Ao usar o comando DROP em uma tabela, todos os índices criados nela também são excluídos implicitamente.

O exemplo a seguir exclui uma tabela. Não o execute neste laboratório:

DROP TABLE new_page_view;

Carregar e consultar dados

Nesta etapa, você vai carregar dados temporários em uma tabela particionada do Hive e consultar o resultado.

Carregar dados

Há várias maneiras de carregar dados em uma tabela do Hive. Você pode criar tabelas externas que apontam para locais específicos no HDFS. Nesse caso, use o comando put ou copy do HDFS para copiar o arquivo de dados para o local especificado e crie uma tabela que aponte para esse local. Essa tabela contém todas as informações relevantes sobre o formato das linhas.

Depois de criar a tabela, você pode transformar os dados e inseri-los em outra tabela do Hive. No início deste laboratório, enviamos o arquivo log_example.csv para o HDFS e o renomeamos como page_view. Para carregar os dados na partição correspondente da tabela page_view, siga os comandos abaixo.

Primeiro, crie uma tabela externa associada ao arquivo especificado:

CREATE EXTERNAL TABLE page_view_stg(viewTime INT, userid BIGINT,
                Page_url STRING, referrer_url STRING,
                Ip STRING COMMENT 'IP Address of the User',
                Country STRING COMMENT 'country of origin')
COMMENT 'This is the staging page view table'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '44' LINES TERMINATED BY '\n' STORED AS TEXTFILE
LOCATION '/user/data/staging/page_view';

Em seguida, crie a tabela page_view para armazenar os dados finais:

CREATE TABLE page_view(viewTime INT, userid BIGINT,
                Page_url STRING, referrer_url STRING,
                Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
STORED AS SEQUENCEFILE;

Esse pequeno conjunto de dados de prática não precisa de uma tarefa distribuída no YARN. Configure o executor local de tarefas do Hadoop para esta sessão do Hive, assim a inserção será executada de forma confiável na VM do laboratório:

SET mapreduce.framework.name=local;

Por fim, insira os dados da tabela externa na tabela page_view:

FROM page_view_stg pvs
INSERT OVERWRITE TABLE page_view
PARTITION(dt='2015-05-17', country='us')
SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, pvs.ip
WHERE pvs.country = 'us';

A tarefa local deve ser concluída em alguns segundos e carregar as linhas correspondentes na partição da tabela page_view.

...
Loading data to table default.page_view partition (dt=2015-05-17, country=us)
MapReduce Jobs Launched:
Stage-Stage-1: HDFS Read: ... HDFS Write: ... SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
Time taken: ... seconds

Consulta simples

Depois de inserir os dados, você pode fazer uma consulta simples, semelhante a uma instrução SQL comum. Digite a instrução a seguir na interface de linha de comando do Hive:

SELECT * FROM page_view WHERE userid = 0 LIMIT 10;

O resultado contém os registros consultados:

hive> select * from page_view;
OK
NULL 490 /downloads/product_1 /archives/webroot 217.168.17.5 2015-05-17 us
NULL 490 /downloads/product_2 /archives/webroot 217.168.17.5 2015-05-17 us
NULL 3316 /downloads/product_2 /archives/webroot 217.168.17.5 2015-05-17 us
...

Encerrar os serviços

Nesta etapa, você vai sair do Hive e parar os serviços do Hadoop. Antes disso, consulte estes recursos para continuar aprendendo:

Quando terminar, use o comando quit para sair da interface de linha de comando do Hive:

quit;

Não se esqueça de parar o serviço HDFS. Digite os comandos a seguir no terminal:

stop-yarn.sh
stop-dfs.sh

Resumo

Nesta atividade, você conheceu a arquitetura, a instalação e a implantação do Hive, além de algumas instruções básicas de HQL. Você também aprendeu a importar dados usando um conjunto de dados de exemplo.

Os principais tópicos abordados foram:

  • Arquitetura do Hive
  • Unidades básicas de dados do Hive
  • Como implantar o Hive
  • Linguagem HQL do Hive

Em geral, ainda há muito a explorar sobre os recursos do Hive como pacote de software para data warehouses. Crie o hábito de consultar materiais técnicos por conta própria e continue aprendendo nos próximos cursos.