Introdução
Este laboratório foca na configuração e operações básicas do Hive, projetado para estudantes com uma certa base em SQL, a fim de entender a arquitetura, a implantação básica e o uso do Hive.
Insira todo o código de exemplo no documento por conta própria; não apenas copie e cole o código, tanto quanto possível. Somente dessa forma você poderá se familiarizar mais com o código. Se tiver problemas, revise cuidadosamente a documentação ou pode ir ao fórum para obter ajuda e comunicação.
Introdução ao Hive
Apache Hive é um pacote de software de data warehouse construído sobre o Hadoop para consultar e analisar grandes conjuntos de dados usando consultas semelhantes a SQL. Ele simplifica a agregação de dados, consultas ad hoc e análise de big data, fornecendo uma interface SQL familiar para os usuários. Aqui está uma visão geral da arquitetura e dos principais recursos do Hive:
Arquitetura do Hive
- Componentes: O Hive consiste em
HCatalogpara gerenciamento de tabelas e armazenamento eWebHCatpara executar tarefas MapReduce, consultas Pig ou interagir com metadados do Hive via API REST. - Recursos:
- Suporta consultas SQL para tarefas de data warehousing, como ETL, análise de dados e relatórios.
- Os dados são armazenados em sistemas de armazenamento como HDFS ou HBase; as operações de consulta são executadas por mecanismos de cálculo como Tez, Spark ou MapReduce.
- Suporta linguagens procedurais, HPL-SQL e recuperação de subconsultas com suporte a Hive LLAP, YARN e Slider.
Unidades Básicas de Dados no Hive
- Banco de Dados (Database): Namespace para evitar conflitos de nomes e aprimorar a segurança.
- Tabela (Table): Unidades de dados homogêneas com o mesmo esquema (por exemplo, tabela
page_viewscom colunas como timestamp, userid, page_url). - Partição (Partition): Divide os dados em partições com base em chaves para uma recuperação de dados eficiente.
- Bucket: Divide os dados particionados em buckets com base em valores de função hash para melhorar a eficiência da consulta.
Tipos de Dados do Hive
- Suporta tipos de dados primitivos e complexos. Consulte a documentação sobre tipos de dados do Hive para obter detalhes.
O Hive foi projetado para tarefas de data warehousing, em vez de processamento de transações online (OLTP), com foco em escalabilidade, desempenho, confiabilidade e tolerância a falhas. Ele suporta vários formatos de entrada e pode ser estendido com conectores em diferentes formatos. Compreender a arquitetura, as unidades de dados e os tipos de dados do Hive é essencial para aproveitar seus recursos em análise de big data.
Instalação e Implantação do Hive
Esta seção foca no download e configurações de diretórios, configurações de variáveis de ambiente, configurações de configuração do metabase, parâmetros do sistema Hive e inicialização do metabase.
Primeiro, você precisa mudar para o usuário hadoop para realizar as operações subsequentes. Dê um duplo clique para abrir o terminal Xfce na sua área de trabalho e insira os seguintes comandos:
su - hadoop
Dica: a senha é 'hadoop' do usuário 'hadoop'
Em seguida, use o comando wget para baixar a versão estável mais recente do Hive. Escolhemos a versão 2.3.3 do Hive aqui:
sudo wget https://labexfile.oss-us-west-1.aliyuncs.com/courses/144/apache-hive-2.3.3-bin.tar.gz
Em seguida, você precisa extrair o pacote de instalação baixado. Insira o seguinte comando 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. Se você não usar o privilégio sudo, poderá não conseguir escrever no diretório /opt:
sudo mv /home/hadoop/apache-hive-2.3.3-bin /opt/hive-2.3.3
Após mover o diretório, você precisa alterar o proprietário do diretório do Hive para o usuário hadoop e seu grupo de usuários. Por favor, insira o seguinte comando no terminal:
sudo chown -R hadoop:hadoop /opt/hive-2.3.3
Dica: você pode abrir outro terminal para realizar 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ções das Variáveis de Ambiente
Após o diretório ter sido configurado, você precisa definir as variáveis de ambiente do Hive para que HIVE_HOME aponte para seu diretório de instalação.
Primeiro, abra o arquivo .bashrc do usuário hadoop usando o editor vim. Insira o seguinte comando no terminal:
vim /home/hadoop/.bashrc
Adicione o seguinte conteúdo no final do arquivo. O PATH precisa ser modificado de acordo com a situação real do ambiente de experimento atual. A expressão $PATH é usada para se referir ao conteúdo existente. Adicione :$HIVE_HOME/bin diretamente no 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 a edição estiver completa. Em seguida, use o comando source para ativar as variáveis de ambiente acima.
Neste laboratório, pré-instalamos o Hive, portanto, você não precisa da variável de ambiente source, mas em sua instalação real, esta etapa é feita caso a caso.
Configurar a Configuração
Este é um processo de configuração do Hive, nesta etapa, você pode apenas visualizar sem praticar, porque pré-configuramos um Hive no laboratório, e este Hive pré-instalado, você pode usar o comando which hive para visualizar, mas a criação do arquivo ainda precisa ser realizada, porque esta é a credencial que determina se você passa no teste ou não.
Configuração do Metabase
Antes de poder usar o Hive oficialmente, você precisa configurar seu armazenamento de metadados. Por padrão, o Hive armazena informações de metadados em um banco de dados Derby embutido. Sua localização de armazenamento em disco é determinada pelo item de configuração javax.jdo.option.ConnectionURL no arquivo de configuração do Hive conf/hive-default.xml. Por padrão, esta localização é ./metastore_db.
Mas neste laboratório, usaremos o MySQL como armazenamento para metadados. Portanto, você precisa modificar o arquivo de configuração do Hive.
Crie e abra este arquivo de configuração que construímos com 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>
Após editar os itens de configuração acima, salve o arquivo e saia do editor.
Criar 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
Configurando Parâmetros do Sistema Hive
Após o metabase ter sido configurado, você precisa definir os itens de configuração interna do Hive para identificar a localização do Hadoop, o caminho do arquivo de configuração interna e assim por diante.
A primeira coisa a fazer é usar o comando cp para fazer uma cópia do modelo de configurações para que ele entre em vigor.
Por favor, insira 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 para o caminho de instalação do Hadoop:
HADOOP_HOME=/home/hadoop/hadoop
Após editar os itens de configuração acima, salve o arquivo e saia do editor.
Inicializando o Metabase
Depois que todo o trabalho de configuração estiver concluído, você pode começar a inicializar o metabase.
Como os dados usados posteriormente serão armazenados no HDFS, você precisa iniciar o HDFS com antecedência. Insira os seguintes comandos no terminal para iniciar o HDFS:
start-dfs.sh
start-yarn.sh
Você precisa digitar jps para ver o status do serviço:
hadoop:~/ $ jps [17:31:43]
8960 Jps
3153 NodeManager
2823 SecondaryNameNode
3017 ResourceManager
2570 DataNode
2428 NameNode
Se você estiver usando o Hadoop pela primeira vez, precisará excluir os dados do Hadoop e inicializá-lo com hdfs namenode -format.
Neste laboratório, inicializamos o Hive pré-instalado com o banco de dados superior, é claro, se você quiser inicializar o Hive que acabou de baixar, use o seguinte comando.
/opt/hive-2.3.3/bin/schematool -initSchema -dbType mysql
Initialization script completed
schemaTool completed
Aqui, se você inicializar o Hive que acabou de baixar, terá que alterar o caminho de HIVE_HOME em '~/.bashrc' para o caminho do Hive que acabou de instalar e fazer o source, e meu conselho é não fazer isso, porque nossos testes subsequentes do Hive são todos baseados em nosso Hive pré-instalado!
Quando a mensagem de prompt indicar que a inicialização foi concluída, você pode usar o comando hive para entrar em sua linha de comando. Insira o seguinte comando no terminal:
hive
Dica: Digitar hive diretamente em nosso shell Hive pré-instalado, adicione o caminho absoluto e você estará no shell Hive 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
Em seguida, aprenderemos algumas operações básicas no Hive. Além de algumas das instruções operacionais mencionadas nesta seção, todas as instruções do Hive podem ser encontradas em seu Manual de Linguagem. Você pode experimentar mais instruções após concluir esta seção.
Criando uma Tabela
Primeiro, você precisa obter alguns dados. Os dados usados nesta seção do experimento são principalmente um arquivo de log simulando o servidor NginX, que pode ser usado para analisar as visualizações de página do site.
Reabra um terminal e insira os seguintes comandos no terminal para baixar os dados de exemplo:
su hadoop
cd ~
wget http://labfile.oss-cn-hangzhou.aliyuncs.com/courses/567/log_example.csv
Em seguida, carregue 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
A primeira coisa depois de ter os dados é criar a tabela. Se você deseja criar uma tabela page_view para os dados acima, você precisa inserir a seguinte instrução 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 na tabela recebe um tipo apropriado. E, podemos anexar comentários nos níveis de coluna e tabela. Além disso, a cláusula PARTITIONED BY define uma coluna de partição que é diferente da coluna de dados. A coluna de partição não é armazenada com a coluna de dados. Quando você especifica uma coluna de partição dessa forma, um caractere de nova linha é usado como separador para cada linha.
Se os dados não estiverem no formato acima, você pode parametrizar o separador de campo, conforme mostrado no exemplo a seguir:
A instrução a seguir é apenas para fins de demonstração e não precisa ser inserida 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 linha é determinado pelo separador no sistema Hadoop, em vez do Hive, não podemos alterar manualmente o separador de linha.
Normalmente, a tabela na qual os dados da coluna são determinados é armazenada em um bucket, o que facilitará a amostragem eficiente da consulta do conjunto de dados. Se não houver bucket, mesmo que a amostragem aleatória da tabela possa ser concluída, ela não pode obter amostragem de alta eficiência no processo de varredura de todos os dados. O exemplo a seguir mostra como habilitar o armazenamento de bucket para a tabela page_view na coluna userid.
A instrução a seguir é apenas para fins de demonstração e não precisa ser inserida 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 na tabela é agregada em 32 buckets por uma função hash. Em cada bucket, os dados são classificados em ordem crescente de viewTime. Este método de organização de dados permite que os usuários amostrem efetivamente colunas agregadas (aqui a coluna userid) e o recurso de classificação permite que os gerentes de dados avaliem as consultas com mais eficiência por meio de melhores estruturas de dados.
A instrução a seguir é apenas para fins de demonstração e não precisa ser inserida 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 na tabela é definido em termos de nomes e tipos de campo, muito semelhante às definições de tipo em outras linguagens de programação. Observe que os nomes das tabelas e os nomes das 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 tabela. Além disso, a cláusula PARTITIONED BY define colunas de partição que são diferentes das colunas de dados. Como mencionado anteriormente, na verdade, eles não armazenam os dados. A cláusula CLUSTERED BY especifica qual coluna usar para criar quantos buckets. A cláusula ROW FORMAT DELIMITED especifica como armazenar linhas em uma tabela Hive. Para formatos delimitados, esta instrução especifica como determinar o símbolo de terminação para um campo, como determinar o símbolo de terminação para um item em uma coleção (array ou mapa) e o símbolo de terminação para determinar a chave do mapa de terminação, onde 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, o tipo SequenceFile do Hadoop). Entre eles, as configurações nas cláusulas ROW FORMAT e STORED AS são os valores padrão que o Hive está usando atualmente. Portanto, não os escrevemos explicitamente na instrução que criou a tabela no início.
Navegando pelas Tabelas e Partições
Se você deseja listar as tabelas existentes em seu warehouse, pode usar a seguinte instrução:
SHOW TABLES;
Se houver muitas tabelas, a instrução acima gerará muitas informações de retorno. Você pode restringir o escopo especificando um prefixo. Por exemplo, se você deseja listar uma tabela com o prefixo page, pode usar a seguinte instrução:
SHOW TABLES 'page.*';
As regras de correspondência nesta instrução são as mesmas da sintaxe de expressão regular, e o ponto (.) representa um curinga.
Se você deseja listar as partições de uma tabela, use a seguinte instrução. Se a tabela não for uma tabela particionada, nenhuma informação será retornada:
SHOW PARTITIONS page_view;
Se você deseja listar as colunas e os tipos de coluna de uma tabela, pode usar a instrução DESCRIBE:
DESCRIBE page_view;
Se você deseja listar as colunas da tabela e todas as outras propriedades, você precisa adicionar a palavra-chave EXTENDED. Isso imprimirá muitas informações, que geralmente são usadas para depuração:
DESCRIBE EXTENDED page_view;
Modificando uma Tabela
Se você deseja renomear uma tabela existente, use a instrução ALTER TABLE com RENAME TO. Se uma tabela com o novo nome já existir, um erro será retornado:
ALTER TABLE page_view RENAME TO new_page_view;
Visualize 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 adicionar uma coluna) preservarão o esquema para a partição antiga da tabela para evitar que ela se torne uma tabela particionada. Todas as consultas que acessam essas colunas e são executadas na partição antiga retornam implicitamente valores nulos ou os valores padrão especificados para essas colunas.
Excluindo Tabelas e Partições
Como o Hive foi projetado como um data warehouse, a destruição de dados é sempre negativa. Portanto, a operação de exclusão de uma tabela é um pouco complicada. Usar o comando DROP na tabela excluirá implicitamente quaisquer índices construídos na tabela.
Você pode usar os seguintes comandos para excluir uma tabela:
DROP TABLE new_page_view;
Carregamento e Consulta de Dados
No Hive, carregar dados e consultar dados são duas operações diferentes. Este documento descreve como carregar dados em uma tabela Hive.
Carregando Dados
Existem várias maneiras de carregar dados em uma tabela Hive. Os usuários podem criar tabelas externas que apontam para locais específicos no HDFS. Nesse uso, 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 apontando para esse local. Esta tabela conterá todas as informações relevantes de formato de linha.
Depois de criados, os usuários podem converter os dados e inseri-los em qualquer outra tabela Hive. Carregamos o arquivo log_example.csv para o HDFS desde o início e o renomeamos para page_view. Se quisermos carregá-lo na tabela page_view da partição correspondente, podemos fazê-lo com o seguinte comando.
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;
Finalmente, 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';
Pode levar alguns minutos para que os dados sejam carregados no HDFS e, em seguida, na tabela page_view.
...
Loading data to table default.page_view partition (dt=2015-05-17, country=us)
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 6.31 sec HDFS Read: 369021 HDFS Write: 22943 SUCCESS
Total MapReduce CPU Time Spent: 6 seconds 310 msec
OK
Time taken: 25.304 seconds
Consulta Simples
Após inserir os dados, podemos fazer uma consulta simples. Isso é semelhante a uma instrução SQL comum. Insira a seguinte instrução 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 Serviços
Se você quiser aprender mais sobre as instruções de ação do Hive, pode ler as seguintes extensões:
Quando terminar de usá-lo, você pode usar o comando quit para sair da interface de linha de comando do Hive:
quit;
Claro, não se esqueça de desligar o serviço HDFS. Insira o seguinte comando no terminal:
stop-yarn.sh
stop-dfs.sh
Resumo
Esta sessão apresenta a arquitetura, instalação e implantação do Hive, e as instruções básicas em HQL. Além disso, aprendemos a importar dados usando os dados de exemplo.
Os principais pontos mencionados são:
- Arquitetura do Hive
- Unidade básica de dados do Hive
- Como implantar o Hive
- Linguagem HQL do Hive
Em geral, como um pacote de software de data warehouse, as funções do Hive precisam ser exploradas mais a fundo. Por favor, mantenha o hábito de revisar ativamente os materiais técnicos e continue aprendendo os seguintes cursos.



