Configuração do MySQL como Metastore do Hive

Instalação do MySQL

Neste paso-a-passo vamos configurar o Hive para usar o MySQL como Metastore. Abaixo vamos instalar o MySQL no namenode01.

hadoop@namenode01:~$ sudo apt-get update
hadoop@namenode01:~$ sudo apt-get install mysql-server-5.7

Durante a instalação defina uma senha para o usuario root do mysql. Em seguida rode o mysql_secure_installation. Configure Disallow root login remotely to NO e YES para Reload privilege tables.

hadoop@namenode01:~$ sudo mysql_secure_installation

Reinicie o servico do mysql e valide se a instalação foi realizada com sucesso:

hadoop@namenode01:~$ sudo service mysql start

Agora vamos configurar o mysql para que os outros nós possam conectar remotamente.

hadoop@namenode01:~$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
[...]
[mysqld]
.
.
.
lc-messages-dir = /usr/share/mysql
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 192.168.10.11
#
[...]

Agora vamos reiniciar o mysql e validar a versão.

hadoop@namenode01:~$ sudo service mysql restart
hadoop@namenode01:~$ sudo mysql --version
mysql Ver 14.14 Distrib 5.7.20, for Linux (ppc) using EditLine wrapper
hadoop@namenode01:~$

Agora, faremos o login com o usuario root e vamos criar nosso database para ser usado como o metastore do hive.

hadoop@namenode01:~$ mysql -u root -p
mysql> show databases;
mysql> use mysql;
mysql> show tables;
mysql> quit;

Seguindo em frente, vamos criar o bancos de dados/usuários e privilégios de acesso. No nosso lab, usaremos um banco de dados para ser o metastore do HIVE e outro banco de dados para ser a fonte de dados de amostra para importação usando o SQOOP, etc.

Agora vamos criar o metastore para o HIVE. Uma vez que configurarmos o Metastore, vamos usar a linha de comandos beeline para enviar comandos HiveQL (HQL) em vez de usar a linha de comandos hive, que usamos em nosso artigo anterior.

hadoop@namenode01:~$ cd $HIVE_HOME/hive_work
hadoop@namenode01:/srv/hive/hive_work$ mysql -u root -p
mysql> CREATE DATABASE metastore;
mysql> CREATE USER 'hive'@'localhost' IDENTIFIED BY 'abc1234';
mysql> GRANT ALL ON metastore.* TO 'hive'@'localhost';
mysql> CREATE USER 'hive'@'%' IDENTIFIED BY 'abc1234';
mysql> GRANT ALL ON metastore.* TO 'hive'@'%';
mysql> CREATE USER 'hive'@'192.168.10.11' IDENTIFIED BY 'abc1234';
mysql> GRANT ALL ON metastore.* TO 'hive'@'192.168.10.11';
mysql> FLUSH PRIVILEGES;
mysql> quit;

Vamos obter o driver JDBC do MySQL, para que o HIVE possa se conectar ao banco de dados MySQL. Vamos baixar e mover os arquivos JDBC jar do MySQL para a pasta lib do Hive. O conector JDBC está disponível em MySQL Connector/J.

hadoop@namenode01:/srv/hive/hive_work$ cd $HIVE_HOME
hadoop@namenode01:/srv/hive/hive_work$ wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.45.tar.gz
hadoop@namenode01:/srv/hive/hive_work$ tar -xzf mysql-connector-java-5.1.45.tar.gz
hadoop@namenode01:/srv/hive$ mv mysql-connector-java-5.1.45/mysql-connector-java-5.1.45-bin.jar $HIVE_HOME/lib/
hadoop@namenode01:/srv/hive/hive_work$ rm -rf mysql-connector-java-5.1.45
hadoop@namenode01:/srv/hive/hive_work$ rm mysql-connector-java-5.1.45.tar.gz

Em seguida, vamos inicializar o Metastore Server e criar um arquivo de configuração para o hive.

hadoop@namenode01:/srv/hive$ cd $HIVE_HOME/conf

HiveServer2 com Metastore no MySQL

Agora que temos o Metastore no MySQL, podemos lidar com sessões simultâneas. No entanto, para permitir que vários clientes se conectem ao banco de dados do Hive, precisamos iniciar a interface HiveServer2. Isso permitirá que os clientes remotos enviem consultas para o Metastore do Hive.

hadoop@namenode01:/srv/hive/conf$ cp hive-default.xml.template hive-site.xml

Vamos substituir as seguintes Key/Name com os valores correspondentes no arquivo hive-site.xml conforme mostrado abaixo:

hadoop@namenode01:/srv/hive/conf$ vi hive-site.xml
[...]

<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.10.11:3306/metastore?createDatabaseIfNotExist=true</value>

<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>

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

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

<name>hive.metastore.uris</name>
<value>thrift://localhost:9083</value>

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

<name>hive.downloaded.resources.dir</name>
<value>/tmp/hive/${hive.session.id}_resources</value>

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

<name>hive.scratch.dir.permission</name>
<value>777</value>

[...]

O próximo passo é inicializar o MySQL Metastore usando o SchemaTool Utility.

hadoop@namenode01:/srv/hive/conf$ cd $HIVE_HOME/bin
hadoop@namenode01:/srv/hive/bin$ schematool -dbType mysql -userName hive -passWord abc1234 -initSchema

Uma vez que a Inicialização do Esquema foi concluída com sucesso, vamos iniciar o serviço de metastore do hive.

hadoop@namenode01:/srv/hive/bin$ hive --service metastore

Agora ja temos o Hive Metastore Server Up&Running,  vamos abrir uma outra sessão via ssh com o putty para se conectar ao namenode01. Em seguida, vamos conectar ao hive usando a linha de comandos beeline.

hadoop@namenode01:~$ cd $HIVE_HOME/bin
hadoop@namenode01:/srv/hive/bin$ beeline
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/srv/apache-hive-2.3.2-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/srv/hadoop-2.9.0/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Beeline version 2.3.2 by Apache Hive
beeline> !connect jdbc:hive2:// hive abc1234

Uma vez que estamos conectados ao metastore, vamos usar alguns comandos em HiveQL

0: jdbc:hive2://> SHOW DATABASES;
0: jdbc:hive2://> USE default;
0: jdbc:hive2://> SHOW TABLES;
0: jdbc:hive2://> !quit

Agora vamos inicializar o HiveServer2. Faça login no namenode01 em outra sessão  ssh via putty e inicie o serviço conforme abaixo:

hadoop@namenode01:~$ cd $HIVE_HOME/bin
hadoop@namenode01:/srv/hive/bin$ hiveserver2

Agora que o hiveserver2 está rodando, voltemos à linha de comandos do beeline usando nossa sessão de shell anterior no namenode01.

hadoop@namenode01:/srv/hive/bin$ beeline
beeline> !connect jdbc:hive2://localhost:10000 hive abc1234
0: jdbc:hive2://localhost:10000> SHOW DATABASES;
0: jdbc:hive2://localhost:10000> USE default;
0: jdbc:hive2://localhost:10000> SHOW TABLES;
0: jdbc:hive2://localhost:10000> !quit

Neste ponto, temos o HIVE rodando em modo Metastore remoto. Vamos usar o Hive em um estágio posterior. No próximo post vamos instalar o Apache SQOOP.

Douglas Ribas de Mattos
E-mail: douglasmattos0@gmail.comdouglasmattos0@gmail.com
Github: https://github.com/douglasmattos0
LinkedIn: https://www.linkedin.com/in/douglasmattos0/

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *