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 todo o código de exemplo apresentado neste documento; sempre que possível, não apenas copie e cole o código. Assim, você se familiarizará melhor com ele. Se tiver problemas, consulte a documentação com atenção ou acesse o fórum para pedir ajuda e trocar informações.
Introdução ao Hive
Nesta etapa, você aprenderá como o Apache Hive fornece uma interface SQL para consultar e analisar grandes conjuntos de dados armazenados com o Hadoop. Veja uma visão geral da arquitetura e dos principais recursos do Hive:
Arquitetura do Hive
- Componentes: o Hive inclui o
HCatalog, responsável pelo gerenciamento de tabelas e armazenamento, e oWebHCat, 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 são 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 recuperação por subconsultas, com suporte a Hive LLAP, YARN e Slider.
Unidades básicas de dados no Hive
- Banco de dados: namespace usado para evitar conflitos de nomes e aumentar a segurança.
- Tabela: unidade de dados homogênea com o mesmo esquema, como a tabela
page_views, que pode conter colunas como timestamp, userid e page_url. - Partição: divide os dados em partições com base em chaves para tornar a recuperação mais eficiente.
- Bucket: divide os dados particionados em buckets com base nos valores de uma função hash para melhorar a eficiência das consultas.
Tipos de dados do Hive
- O Hive oferece suporte a tipos de dados primitivos e complexos. Consulte a documentação sobre tipos de dados do Hive para obter mais detalhes.
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 estendido com conectores para diferentes formatos. Entender a arquitetura, as unidades de dados e os tipos de dados do Hive é essencial para aproveitar seus recursos na análise de big data.
Instalação e implantação do Hive
Nesta etapa, você revisará 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 executar as operações seguintes. Clique duas vezes no terminal Xfce na área de trabalho para abri-lo e digite os comandos abaixo:
su - hadoop
dica: a senha do usuário hadoop é hadoop.
Em seguida, use o comando wget para baixar a versão estável mais recente do Hive. Neste laboratório, escolhemos a versão 2.3.3 do Hive:
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 comando a seguir no terminal:
tar -zxvf apache-hive-2.3.3-bin.tar.gz
Use o privilégio sudo para mover o diretório extraído para o diretório /opt. Sem o privilégio sudo, talvez você não consiga gravar no diretório /opt:
sudo mv /home/hadoop/apache-hive-2.3.3-bin /opt/hive-2.3.3
Depois de mover o diretório, altere o proprietário do diretório do Hive e o grupo ao qual ele pertence para hadoop. Digite o comando abaixo 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 o privilégio 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ê 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 usando o editor vim. Digite o comando a seguir no terminal:
vim /home/hadoop/.bashrc
Adicione o conteúdo abaixo ao final do arquivo. O valor de PATH deve ser ajustado de acordo com a situação real do ambiente do experimento. A expressão $PATH é usada para fazer referência ao conteúdo existente. Adicione :$HIVE_HOME/bin diretamente ao final da variável de ambiente PATH:
export HIVE_HOME=/opt/hive-2.3.3
export PATH=$PATH:$HIVE_HOME/bin
Salve o arquivo e saia do editor quando terminar a edição. Em seguida, use o comando source para ativar as variáveis de ambiente acima.
Neste laboratório, o Hive já foi pré-instalado, portanto você não precisa executar source para ativar a variável de ambiente. Em uma instalação real, essa etapa deve ser executada conforme a situação.
Configuração
Nesta etapa, você 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 oficialmente, você precisa configurar o armazenamento de metadados. Por padrão, o Hive armazena as informações de metadados em um banco de dados Derby incorporado. O local de armazenamento no disco é determinado pelo item de 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. Portanto, você precisa modificar o arquivo de configuração do Hive.
Crie e abra o arquivo de configuração usando o editor vim:
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
Configuração dos parâmetros do sistema do Hive
Depois de configurar o metastore, você precisa definir os itens de configuração internos do Hive para indicar o local do Hadoop, o caminho dos arquivos de configuração internos e outras informações.
Primeiro, use o comando cp para fazer uma cópia do modelo de configurações e ativá-lo.
Digite o comando abaixo 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.
Inicialização do metastore
Nesta etapa, você inicializará o metastore do Hive e iniciará os serviços do Hadoop necessários para o Hive.
Como os dados usados posteriormente serão armazenados no HDFS, você precisa iniciar o HDFS antecipadamente. Digite os comandos abaixo no terminal para iniciar o HDFS:
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 estiver usando o Hadoop pela primeira vez, você precisará excluir os dados do Hadoop e inicializá-lo com hdfs namenode -format.
Neste laboratório, o Hive pré-instalado já foi inicializado com o banco de dados correspondente. Se quiser inicializar o Hive que acabou de baixar, use o comando abaixo:
/opt/hive-2.3.3/bin/schematool -initSchema -dbType mysql
Initialization script completed
schemaTool completed
Se você inicializar pela primeira vez o Hive que acabou de baixar, será necessário alterar o caminho de HIVE_HOME em ~/.bashrc para o caminho do Hive recém-instalado e executar source. No entanto, recomendamos não fazer isso, pois os testes seguintes do Hive são todos baseados no Hive pré-instalado.
Quando a mensagem do prompt indicar que a inicialização foi concluída, use o comando hive para entrar na linha de comando do Hive. Digite o comando abaixo no terminal:
hive
dica: ao digitar hive diretamente no shell do Hive pré-instalado, adicione o caminho absoluto para entrar no shell do Hive que você 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ê aprenderá as operações básicas com tabelas do Hive. Todas as instruções do Hive também estão disponíveis no Language Manual.
Criar uma tabela
Primeiro, você precisa obter alguns dados. Os dados usados nesta seção do laboratório são principalmente um arquivo de log que simula um servidor NginX e que pode ser usado para analisar as visualizações de páginas de um site.
Abra novamente um terminal e digite os comandos abaixo para baixar os dados de exemplo:
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, o primeiro passo é criar a tabela. Para criar uma tabela page_view para os dados acima, 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 recebe um tipo apropriado. Também podemos adicionar comentários nos níveis de coluna e de tabela. Além disso, a cláusula PARTITIONED BY define uma coluna de partição diferente das colunas de dados. A coluna de partição não é armazenada junto com as colunas de dados. Quando você especifica uma coluna de partição dessa forma, um caractere de nova linha é usado como separador de cada linha.
Se os dados não estiverem no formato acima, você poderá parametrizar o separador de campos, como no exemplo a seguir:
A instrução abaixo serve apenas para demonstração e não deve ser digitada no shell 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;
Como o separador de linhas é determinado pelo separador no sistema Hadoop, e não pelo Hive, não podemos alterá-lo manualmente.
Normalmente, a tabela em que os dados das colunas são definidos é armazenada em buckets, o que permite realizar amostragens eficientes do conjunto de dados. Sem buckets, mesmo que seja possível concluir uma amostragem aleatória da tabela, não será possível obter alta eficiência durante a varredura de todos os dados. O exemplo a seguir mostra como ativar o armazenamento em buckets para a tabela page_view usando a coluna userid.
A instrução abaixo serve apenas para demonstração e não deve ser digitada no shell 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 da tabela é agrupada em 32 buckets por meio de uma função hash. Em cada bucket, os dados são classificados em ordem crescente de viewTime. Esse método de organização permite que os usuários façam amostragens eficientes das colunas agrupadas — neste caso, a coluna userid —, enquanto o recurso de classificação permite que os administradores de dados avaliem as consultas com mais eficiência por meio de estruturas de dados melhores.
A instrução abaixo serve apenas para demonstração e não deve ser digitada no shell 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 por nomes e tipos de campos, de forma bastante semelhante às definições de tipos em outras linguagens de programação. Observe que os nomes de tabelas e colunas não diferenciam maiúsculas de minúsculas. IP Address of the User e a instrução COMMENT abaixo indicam que podemos adicionar comentários nos níveis de coluna e de 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 qual coluna será usada para criar os buckets e quantos buckets serão criados. A cláusula ROW FORMAT DELIMITED especifica como armazenar as linhas em uma tabela do Hive. Para formatos delimitados, essa instrução especifica como determinar o símbolo de término de um campo, o símbolo de término de um item em uma coleção — array ou map — e o símbolo de término usado para determinar a chave de um map; os números estão na codificação 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, não as escrevemos explicitamente na instrução que criou a tabela no início.
Consultar tabelas e partições
Para listar as tabelas existentes no seu warehouse, use a instrução abaixo:
SHOW TABLES;
Se houver muitas tabelas, a instrução acima retornará muitas informações. Você pode restringir o resultado especificando um prefixo. Por exemplo, para listar tabelas com o prefixo page, use a instrução abaixo:
SHOW TABLES 'page.*';
As regras de correspondência usadas nessa instrução são iguais às da sintaxe de expressões regulares, e o ponto (.) representa um caractere curinga.
Para listar as partições de uma tabela, use a instrução abaixo. Se a tabela não for particionada, nenhuma informação será retornada:
SHOW PARTITIONS page_view;
Para listar as colunas e os tipos de coluna de uma tabela, use a instrução DESCRIBE:
DESCRIBE page_view;
Para listar as colunas da tabela e todas as outras propriedades, adicione a palavra-chave EXTENDED. Isso imprimirá muitas informações e geralmente é usado 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á existir uma tabela com o novo nome, será retornado 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 podemos renomear as colunas de uma tabela existente. No entanto, é importante observar que você deve 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');
Observe que as alterações no esquema, como a adição de uma coluna, preservarão o esquema da partição antiga da tabela para evitar que ela se torne uma tabela particionada. Todas as consultas que acessarem essas colunas e forem executadas na partição antiga retornarão implicitamente valores nulos ou os valores padrão especificados para essas colunas.
Excluir tabelas e partições
Como o Hive foi desenvolvido como um data warehouse, a destruição de dados é sempre uma operação negativa. Por isso, a exclusão de uma tabela é um pouco trabalhosa. Usar o comando DROP na tabela excluirá implicitamente todos os índices criados nela.
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ê carregará dados preparados em uma tabela particionada do Hive e consultará o resultado.
Carregar dados
Existem várias maneiras de carregar dados em uma tabela do Hive. Os usuários podem criar tabelas externas que apontam para locais específicos no HDFS. Nesse caso, o usuário pode usar o comando put ou copy do HDFS para copiar o arquivo de dados para o local especificado e criar uma tabela que aponte para esse local. Essa tabela conterá todas as informações relevantes sobre o formato das linhas.
Depois de criar a tabela, os usuários podem converter os dados e inseri-los em qualquer outra tabela do Hive. Já enviamos o arquivo log_example.csv para o HDFS e o renomeamos como page_view. Para carregá-lo na tabela page_view da partição correspondente, use o comando abaixo.
Primeiro, crie uma tabela externa e associe-a 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 uma tabela page_view para o armazenamento final dos dados:
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;
Este pequeno conjunto de dados de prática não precisa de um job YARN distribuído. Configure o executor de jobs local do Hadoop para esta sessão do Hive, para que a inserção seja executada de forma confiável dentro da máquina virtual 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';
O job local deve terminar 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ê poderá executar uma consulta simples. Ela é semelhante a uma instrução SQL comum. Digite a instrução abaixo na interface de linha de comando do Hive:
SELECT * FROM page_view WHERE userid = 0 LIMIT 10;
As informações retornadas são 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ê sairá do Hive e interromperá os serviços do Hadoop depois de consultar os seguintes recursos para continuar aprendendo:
Quando terminar de usar o Hive, use o comando quit para sair da interface de linha de comando:
quit;
Não se esqueça de desligar o serviço HDFS. Digite o comando abaixo no terminal:
stop-yarn.sh
stop-dfs.sh
Resumo
Nesta sessão, você conheceu a arquitetura, a instalação e a implantação do Hive, além das instruções básicas de HQL. Também aprendeu a importar dados usando o conjunto de dados de exemplo.
Os principais pontos abordados foram:
- Arquitetura do Hive
- Unidade básica de dados do Hive
- Como implantar o Hive
- Linguagem HQL do Hive
De modo geral, como pacote de software para data warehouse, o Hive ainda oferece muitos recursos a serem explorados. Mantenha o hábito de consultar ativamente os materiais técnicos e continue seus estudos nos cursos seguintes.



