Compatibilidade de Versões e Arquitetura
A partir da versão 3.2.3, o ecossistema Hadoop passou a exigir obrigatoriamente o JDK 11. No entanto, o Apache Hive 3.1.3 ainda apresanta dependências críticas do JDK 1.8. Para viabilizar a execução conjunta e estável de ambos os componentes, este guia detalha a implantação do Hadoop 3.2.2 em conjunto com o Hive 3.1.3, utilizando o Java 8 como base.
Topologia do Cluster
- Nós:
hadoop-master(Nó Mestre),hadoop-worker-1,hadoop-worker-2 - Ambiente Java: JDK 1.8
- Componentes: Hadoop 3.2.2, Hive 3.1.3, MySQL (para o Metastore)
- Configuração dos Arquivos do Hadoop
Assumindo que o Hadoop foi extraído para o diretório /opt/hadoop, edite os arquivos de configuração localizados em /opt/hadoop/etc/hadoop/.
hadoop-env.sh
Defina o caminho absoluto para o JDK 1.8.
export JAVA_HOME=/opt/jdk1.8
core-site.xml
Configure o diretório temporário, o esquema de arquivos padrão e o usuário estático da interface web.
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/data/tmp</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop-master:9820</value>
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
</configuration>
hdfs-site.xml
Defina os endereços da interface web do NameNode e os diretórios de armazenamento para NameNode, DataNode e JournalNode.
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop-master:9870</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop/data/hdfs/journal</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop/data/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/hadoop/data/hdfs/data</value>
</property>
</configuration>
yarn-site.xml
Configure o ResourceManager, os serviços auxiliares do NodeManager e a whitelist de variáveis de ambiente.
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
mapred-site.xml
Defina o framework de execução e os endereços do servidor de histórico de jobs.
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop-master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop-master:19888</value>
</property>
</configuration>
workers
Liste os hostnames dos nós que atuarão como DataNodes e NodeManagers.
hadoop-worker-1
hadoop-worker-2
- Ajuste de Permissões nos Scripts de Inicialização
Para evitar erros de permissão ao executar os serviços como root, insira as seguintes declarações no início das funções nos scripts localizados em /opt/hadoop/sbin/.
Em start-yarn.sh e stop-yarn.sh:
YARN_RESOURCEMANAGER_USER=root
HDFS_DATANODE_SECURE_USER=yarn
YARN_NODEMANAGER_USER=root
Em start-dfs.sh e stop-dfs.sh:
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
Após as modificações, sincronize o diretório do Hadoop para os nós workers:
rsync -avz /opt/hadoop/ root@hadoop-worker-1:/opt/hadoop/
rsync -avz /opt/hadoop/ root@hadoop-worker-2:/opt/hadoop/
- Formatação do NameNode e Inicialização
No nó mestre, formate o sistema de arquivos HDFS pela primeira vez:
/opt/hadoop/bin/hdfs namenode -format
Inicie os daemons do HDFS e YARN e valide os processos Java utilizando o comando jps em cada nó.
- Instalação e Configuração do Hive
Extraia o binário do Hive para /opt/hive.
hive-site.xml
Crie o arquivo em /opt/hive/conf/ para configurar a conexão com o banco de dados MySQL (Metastore) e a interface web do HiveServer2. Nota: A sintaxe XML foi corrigida e otimizada em relação a configurações padrão.
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive_metastore?createDatabaseIfNotExist=true&characterEncoding=UTF-8&useSSL=false</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>hive_admin</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>secure_password_123</value>
</property>
<property>
<name>hive.server2.webui.host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>hive.server2.webui.port</name>
<value>10002</value>
</property>
</configuration>
hive-env.sh
Adicione as variáveis de ambiente no final do arquivo /opt/hive/conf/hive-env.sh:
export HADOOP_HOME=/opt/hadoop
export HIVE_HOME=/opt/hive
export HIVE_CONF_DIR=/opt/hive/conf
export HIVE_AUX_JARS_PATH=/opt/hive/lib
hive-log4j2.properties
Renomeie o template de log e altere o diretório de saída:
mv /opt/hive/conf/hive-log4j2.properties.template /opt/hive/conf/hive-log4j2.properties
Edite o arquivo e defina:
property.hive.log.dir = /opt/hive/logs
- Variáveis de Ambiente Globais
Atualize o arquivo /etc/profile para incluir os binários do Hadoop e do Hive no PATH do sistema:
export JAVA_HOME=/opt/jdk1.8
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export HADOOP_HOME=/opt/hadoop
export HIVE_HOME=/opt/hive
export HIVE_CONF_DIR=/opt/hive/conf
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin
Aplique as alterações com source /etc/profile.
- Execução do HiveServer2
Inicie o serviço do HiveServer2 em background ou em um terminal dedicado:
hive --service hiveserver2
A interface de monitoramento web estará acessível através de http://hadoop-master:10002.
Considerações de Rede e Firewalls
- Resolução de Nomes: O arquivo
/etc/hostsdeve conter o mapeamento correto de IPs para os hostnames (hadoop-master,hadoop-worker-1, etc.), pois o ResourceManager utiliza esses nomes para identificar os nós. - Portas do NameNode: Libere a porta 9820 (RPC) e 9870 (HTTP). A ausência da porta HTTP impede a renderização dos DataNodes na interface web.
- Portas do DataNode: A porta 9866 é utilizada para transferência de blocos. Deve ser liberada caso haja integração com motores de processamento externos, como o Apache Flink.