Tutorial de Instalação do Hive no Windows - WSL


Profa. Emilia Colonese

1. Pré-requisitos

WSL instalado corretamente.
Java Development Kit 1.11.0 instalado corretamente no WSL.
Hadoop instalado corretamente no WSL.

 

2. MySQL

O Apache Hive requer um banco de dados relacional para criar seu Metastore (onde todos os metadados serão armazenados). Usaremos o MySQL.

Entrar no terminal Ubuntu

Faça download do mysql:

$ sudo apt-get install mysql-server

 

2.1. Configurar o mysql como metastore:

Atribui a senha no usuário "root" do MySQL após a instalação. Esta senha não é a mesma do SO.

 $ mysql admin -u root password <senha>


Para alterar a senha do usuário "root" outra vez, terá que utilizar o parâmetro "-p": 

$ mysql admin -u root -p password <senha>
Enter password: <nova_senha> 

Feita a instalação e mudança de senha do usuário "root", você estará apto a desenvolver o trabalho no seu computador conectando normalmente ao MySQL.

Teste a instalação:

    $ systemctl status mysql .service
    $ sudo mysql admin -p -u root -V
   

Se for disponibilizar o acesso ao banco para receber conexões de outras máquinas, atribui as permissões no usuário "root" do MySQL: 

$ sudo mysql -u root      # usar "sudo" pois é uma nova instalação

mysql> use mysql;

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;


Criar e atribuir permissões ao usuário <seu_usuário>

 

mysql> CREATE USER '<seu_usuário>'@'localhost' IDENTIFIED BY '<seu_usuário>';

mysql> GRANT ALL PRIVILEGES ON *.* TO '<seu_usuário>'@'localhost' WITH GRANT OPTION;


mysql> CREATE USER '<seu_usuário>'@'%' IDENTIFIED BY '<seu_usuário>';

mysql> GRANT ALL PRIVILEGES ON *.* TO '<seu_usuário>'@'%' WITH GRANT OPTION;

 

mysql> flush privileges;

mysql> exit;


Com as permissões atribuídas no usuário "root" ou “<seu_usuário>”, ainda não está totalmente liberado para poder fazer as conexões remotas no MySQL. 

No meu caso, eu preferi criar o usuário emilia, senha emilia, para instalar o metastore e usar na configuração do Hive.

No arquivo "/etc/mysql/mysql.conf.d/mysqld.cnf ", na linha bind-address, comente-o adicionando o "#", deixando a linha assim: 

# bind-address = 127.0.0.1

Restartar o mysql:

$ sudo service mysql restart 


Conceder permissão total para os diretórios do mysql:

$ sudo chmod 1777 -R /var/lib/mysql
$ sudo chmod 1777 -R /var/log

Faça download do  mysql connector.

A escolha do conector deve ser feita  de acordo com a versão do Ubuntu. Neste tutorial: Ubuntu Linux 22.04. 

O download do arquivo compactado foi feito pela URL: https://dev.mysql.com/downloads/connector/j/


Ver o conteúdo do arquivo:

$ dpkg --contents mysql-connector-j_9.5.0-1ubuntu22.04_all.deb


Descompactar  (substituir /home/emila pelo caminho do arquivo baixado):

$ cd /

$ sudo dpkg -i /home/emilia/mysql-connector-j_9.5.0-1ubuntu22.04_all.deb

 

3. Baixe e instale o HIVE

Para baixar os binários do Apache Hive, execute os seguintes comandos.

$ cd
wget https://downloads.apache.org/hive/hive-4.0.1/apache-hive-4.0.1-bin.tar.gz

·    Descompacte e instale no diretório /opt/hadoop/hive (substitua /home/emilia pelo caminho onde se encontra o arquivo baixado):


$ cd /opt/hadoop

$ tar -xvzf /home/emilia/apache-hive-4.0.1-bin.tar.gz

$ sudo mv apache-hive-4.0.1-bin hive

$ sudo chmod -R 777 hive


Nota: Substituir emilia pelo seu login. 


4. Configure as variáveis de ambiente

Após extrair os arquivos do Hive, devemos configurar o Hive no .bashrc.

export HIVE_HOME=/opt/hadoop/hive

export HIVE_LIB=$HIVE_HOME/lib

export HIVE_BIN=$HIVE_HOME/bin

export HADOOP_USER_CLASSPATH_FIRST=true

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib

export CLASSPATH=$CLASSPATH:$HIVE_HOME/lib:$HIVE_HOME/conf

export PATH=$PATH:$HIVE_HOME/bin

Execute o .bashrc:

exec bash


Copiar do diretório instalado para HIVE_HOME

$ sudo cp /usr/share/java/mysql-connector-j-9.5.0.jar $HIVE_HOME/lib

$ sudo chmod 777 /opt/hadoop/hive/lib/mysql-connector-j-9.5.0.jar

 

5. Configure o HIVE

5.1. Configurar o hive-env.sh

$ cd /opt/hadoop/hive/conf

$ mv hive-env.sh.template hive-env.sh

 

No hive-env.sh, inserir as seguintes linhas:

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

export HIVE_CONF_DIR=/opt/hadoop/hive/conf

export HADOOP_HOME=/opt/hadoop

export HIVE_HOME=/opt/hadoop/hive


Criar os seguintes arquivos:

$ mv  hive-log4j2.properties.template hive-log4j2.properties

$ mv beeline-log4j2.properties.template beeline-log4j2.properties

$ mv hive-exec-log4j2.properties.template hive-exec-log4j2.properties


Editar o arquivo hive-log4j2.properties e trocar o comando property.hive.log.level de INFO para WARN.


Editar o arquivo hive-exec-log4j2.properties nano hive-exec-log4j2.properties.template e trocar o comando property.hive.log.level de INFO para WARN.


5.2. Configurar o hive-site.xml

Agora, vá para o diretório de configuração do Apache Hive (/opt/hadoop/hive/conf) e crie um novo arquivo “hive-site.xml”. Devemos colar o seguinte código XML dentro deste arquivo:

<?xml version="1.0" encoding="UTF-8"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration>

 

<property>

<name>hive.metastore.db.type</name>

<value>mysql</value>

<description>

      Expects one of [derby, oracle, mysql, mssql, postgres].

Type of database used by the metastore. Information schema &amp; JDBCStorageHandler depend on it.</description>

</property>

<property>

       <name>javax.jdo.option.ConnectionURL</name>

       <value>jdbc:mysql://localhost:3306/metastoredb?createDatabaseIfNotExist=true</value>

       <description>JDBC connect string for a JDBC metastore</description>

</property>

<property>

       <name>javax.jdo.option.ConnectionDriverName</name>

       <value>com.mysql.cj.jdbc.Driver</value>

       <description>Driver class name for a JDBC metastore</description>

</property>

<property>

<name>javax.jdo.option.ConnectionUserName</name>

<value>emilia</value>

</property>

<property>

<name>javax.jdo.option.ConnectionPassword</name>

<value>emilia</value>

</property>

<property>

       <name>hive.server2.enable.doAs</name>

       <description>Enable user impersonation for HiveServer2</description>

       <value>false</value>

</property>

<property>

<name>hive.server2.authentication</name>

       <value>NONE</value>

<description> Client authentication types. NONE: no authentication</description>

</property>

<property>

       <name>datanucleus.schema.autoCreateTables</name>

       <value>true</value>

</property>

<property>

       <name>hive.metastore.uris</name>

       <value>thrift://localhost:9083</value>

<description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>

</property>

<property>

<name>hive.metastore.event.db.notification.api.auth</name>

<value>false</value>

<description>

Should metastore do authorization against database notification related APIs such as get_next_notification.

If set to true, then only the superusers in proxy settings have the permission.</description>

</property>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive/warehouse</value>

</property>

<property>

<name>hive.server2.thrift.http.path</name>

<value>cliservice</value>

<description>The service endpoint</description>

</property>

<property>

<name>hive.querylog.location</name>

<value>/opt/hadoop/hive/tmp</value>

<description>Location of Hive run time structured log file</description>

</property>

<property>

       <name>hive.exec.mode.local.auto</name>

       <value>true</value>

</property>

<property>

<name>hive.exec.local.scratchdir</name>

<value>/opt/hadoop/hive/tmp</value>

<description>Local scratch space for Hive jobs</description>

</property>

<property>

<name>hive.downloaded.resources.dir</name>

<value>/opt/hadoop/hive/tmp</value>

<description>Temporary local directory for added resources in the remote file system.</description>

</property>

<property>

<name>hive.server2.webui.host</name>

<value>0.0.0.0</value>

<description>The host address the HiveServer2 WebUI will listen on</description>

</property>

<property>

<name>hive.server2.webui.port</name>

<value>10002</value>

<description>The port the HiveServer2 WebUI will listen on. This can beset to 0 or a negative integer to disable the web UI</description>

</property>

<property>

<name>hive.server2.webui.max.threads</name>

<value>100</value>

<description>The max HiveServer2 WebUI threads</description>

</property>

<property>

<name>hive.server2.webui.use.ssl</name>

<value>false</value>

<description>Set this to true for using SSL encryption for HiveServer2 WebUI.</description>

</property>

<property>

<name>hive.txn.stats.enabled</name>

<value>false</value>

</property>

<property>

<name>hive.stats.autogather</name>

<value>false</value>

</property>

<property>

<name>hive.log.explain.output</name>

<value>true</value>

<description>Enable view query plan</description>

</property>

 

</configuration>

Nota: Substituir emilia pelo seu login e a password criada para o mysql.


6. Criar diretórios no Linux e no hdfs

$ mkdir /opt/hadoop/hive/tmp
$ sudo chmod -R 777 /opt/hadoop/hive/tmp

Inicie o Hadoop e o Yarn se não estiverem iniciados:

$ start-dfs.sh
$ start-yarn.sh

Crie os diretórios:

$ hdfs dfs -mkdir /user/hive/

$ hdfs dfs -mkdir /user/hive/warehouse

$ hdfs dfs -chmod -R 777 /user/hive

$ hdfs dfs -chmod -R 777 /user/hive/warehouse

 

7. Iniciar o Metastore

7.1. Criar variáveis de ambiente para o Hive

Vá para o seu diretório home:

$ cd

$ nano .bashrc

Insira as linhas que faltam no arquivo .bashrc:

export HIVE_HOME=/opt/hadoop/hive

export HIVE_LIB=$HIVE_HOME/lib

export HIVE_BIN=$HIVE_HOME/bin

export HADOOP_USER_CLASSPATH_FIRST=true

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib

export CLASSPATH=$CLASSPATH:$HIVE_HOME/lib:$HIVE_HOME/conf

export PATH=$PATH:$HIVE_HOME/bin

Execute o arquivo .bashrc:

$ exec bash

 

7.2. Verificar se o Metastore existe

 Usamos o comando schematool para verificar se o Metastore está criado.

Verificar schema no mysql:

$ schematool -dbType mysql -info -verbose

Se a mensagem resultante mostrar que o Metastore não existe, criar com o comando abaixo (só executar uma única vez!!):

$ schematool -dbType mysql -initSchema

Verificar schema novamnte:

$ schematool -dbType mysql -info –verbose

Metastore connection URL:        jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true

Metastore connection Driver :    com.mysql.cj.jdbc.Driver
Metastore connection User:       emilia
Hive distribution version:       4.0.0
Metastore schema version:        4.0.0

Execute os comandos:

$ cd $HIVE_HOME/lib

$ sudo mv log4j-slf4j-impl-2.18.0.jar log4j-slf4j-impl-2.18.0.jarold

$ sudo cp /opt/hadoop/share/hadoop/hdfs/lib/guava-27.0-jre.jar /opt/hadoop/hive/lib/

$ sudo mv guava-22.0.jar guava-22.0.jarold

 

OBS. Se tiver jline_xxx.jar diferente do hive no yarn/lib, copie o mesmo do diretório lib do Hive para o yarn/lib, pois dá erro!

 

Inicie o metastore:

$ hive --service metastore &
tecle<Enter>

 

 

8. Iniciando o Hive

Execute o seguinte:

$ nohup hive --service hiveserver2 &
Tecle <Enter>

NOTA: Ao chamar o Hive, o sistema abre o Beeline porque a Interface de Linha de Comando (CLI) tradicional do Hive foi descontinuada em favor do Beeline, especialmente em versões mais recentes do Hive e das distribuições do Hadoop.

Podemos agora chamar o Hive/Beeline:

$ hive

!connect jdbc:hive2://localhost:10000

 

Quando pedir o usuário digite o seu login.
Quando pedir a password tecle sua password.
Comando para sair do beeline, digite:!q

Para rodar queries complexas, executar:

SET hive.auto.convert.join=false;

(ou colocar no hive-site.xml)

O funcionamento, configuração e status do Hive remoto (Beeline) pode ser visto pela WEB pela URL:http://localhost:10002