Apache Hadoop no CentOS 6-7-8 - Costruindo um Mini File System distribuído
O Hadoop é um projeto Apache para computação distribuída, inspirado no MapReduce e GoogleFS, existem quatro módulos no Hadoop:
Para a instalação do Hadoop em modo distribuído é necessário ter no mínimo três máquinas reais ou virtuais com essas carateristicas:
Agora iremos configurar as placas de rede para poder estabelecer as conexões com a internet e com os outros nós do cluster hadoop para tal acessamos o menu "Aplicativos -> Sistema -> Configurações" na janela se abrirá clicar no ícone "Rede" será exibida as placas que iremos configurar. Fazer as alterações seguintes com bastante atenção pois estas configurações serão usadas para acessar internet e os outros nós do cluster. Verificando o endereço MAC nas opções das placas do VirtualBox iremos atribuir os endenreços IPv4 da seguinte mandeira:
Executar o Virtualbox e criar três VM's com a configuração de hardware que foi especificada nos pré-requisitos, daremos atenção especial nas placas de rede que iremos criar onde a primeira será "Bridge" e a segunda será "rede interna", logo em seguida instalar o S.O. CentOS8, quando for exibida a tela de instalação iremos criar o usuário "root" com uma senha simples e um usuário "hadoop" também com uma senha simples. Ao final da instalação, executar o boot dela na tela de login fazer o acesso com o usuário "hadoop".
Agora iremos inserir o nome do hostname da nossa VM, para fazer isso precisamos clicar no menu "Aplicativos -> Sistema -> Configurações" e na janela que se abrirá clicar no ícone "Detalhes" e no campo "Nome do dispositivo" iremos digitar o nome: "hadoop-master" e fecharemos a janela das configurações.
Desativaremos o sitema SELINUX para a instalação do Hadoop, começamos clicando no menu "Aplicativos -> Favoritos -> Terminal" e uma vez aberto iremos digitar o comando:
sudo vi /etc/selinux/config
e quando solicitada a senha digitaremos a senha que foi criada para o usuário "root", o editor de texto será aberto com o arquivo de configuração do SELINUX, nele iremos alterar a linha:
SELINUX=enforcing
para:
SELINUX=disabled
finalizar salvando o arquivo clicando no botão "Salvar", feito isso precisaremos habilitar as mudanças no nosso CentOS 8 executando, sempre no terminal, o comando:
sudo setenforce 0
Desativaremos o serviço de Firewall para que não haja problemas de portas bloqueadas. Faremos isso digitando no nosso terminal os seguintes comandos:
sudo systemctl stop firewalld
sudo systemctl disable firewalld
Para usar o Hadoop é fundamental instalar o Java JDK e nós usaremos a versão que está disponivel na nossa versão do CentOS 8. Para començar precisamos sincronizar os repositórios do S.O, digitando os seguintes comandos no terminal:
sudo yum clean all && yum repolist
será solicitada a senha e usaremos aquela que foi escolhida para o usuário "root".
Atualizados os repositórios instalaremos o pacote Java JDK digitando:
sudo yum install java-1.8.0-openjdk
Clonagem da VM para a criação de outras duas VM'S que serão os nós
Iremos agora desligar a VM para o processo de clonagem e criar as duas VMs que serão configuradas para ser os nós que irão compor o mini cluster Hadoop esse processo é feito pelo VirtualBox clicando com o botão direto na VM que acabamos de usar. Após clonar renomear cada máquina com o sufixo "slave1" e "slave2", em seguida alterar as placas de rede de cada uma delas mantendo somente as placas de rede interna, por fim iniciar as três VM's clicando duas vezes sobre o nome delas e fazer login com o usuário "hadoop" em todas. Atualização da configuração da rede nas VM's slaves 1 e 2
Para fazer essas autalizaçoẽs devemos executar o comando:
sudo nmtui
que é uma interface textual que irá permitir a editação das configuraçoẽs das placas de redes e do hostname dos nós reispetando a seguinte configuração:
slave1:
IPv4 192.168.100.3
netmask 255.255.255.0 ou /24
Hostname "hadoop-slave1"
slave2:
IPv4 192.168.100.4
netmask 255.255.255.0 ou /24
Hostname "hadoop-slave2"
OBS.: AS MUDANÇAS LISTADAS A SEGUIR DEVEM SER FEITAS NAS TRẼS VMs.
Acessar pelo terminal como "root" para ter permissão de edição no arquivo "hosts" onde inseriremos os IP de todos os nós:
sudo vi /etc/hosts
127.0.0.1 localhost
::1 localhost6.localdomain6 localhost6
192.168.100.2 hadoop-master
192.168.100.3 hadoop-slave1
192.168.100.4 hadoop-slave2
Feito o procedimento acima agora testaremos a conexão utilizando o comando ping
ping hadoop-master
ping hadoop-slave1
ping hadoop-slave2
Configuração das variáveis de ambiente para o Java JDK e o PATH do Hadoop
Alterar o arquivo "~/.bashrc" com o conteúdo abaixo nas três máquinas:
[hadoop@hadoop-master ~]$ vi ~/.bashrc
[hadoop@hadoop-slave1 ~]$ vi ~/.bashrc
[hadoop@hadoop-slave2 ~]$ vi ~/.bashrc
No final do arquivo adicionar o seguinte conteúdo:
export HADOOP_HOME="/hadoop"
export HADOOP_INSTALL="/hadoop"
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
#export HADOOP_OPTS="-Djava.library.path=$HADOOP_INSTALL/lib"
export HADOOP_CONF_DIR=$HADOOP_INSTALL/etc/hadoop
export LD_LIBRARY_PATH=/hadoop/lib/native/:$LD_LIBRARY_PATH
export HIVE_HOME="/hadoop/hive"
export PATH=$PATH:$HIVE_HOME/bin
export JAVA_HOME="/usr/lib/jvm/jre-openjdk"
export PATH=$PATH:$JAVA_HOME/bin
Para ativar as mudanças é necessário executar os comandos abaixo nas três VM's
[hadoop@hadoop-master ~]$ . ~/.bashrc
[hadoop@hadoop-slave1 ~]$ . ~/.bashrc
[hadoop@hadoop-slave2 ~]$ . ~/.bashrc
OBS.: AS MUDANÇAS LISTADAS A SEGUIR DEVEM SER FEITAS SOMENTE NA VM MASTER.
Criar as chaves públicas e privadas para o usuário "hadoop" utilizando os comandos:
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
Agora será necessário duplicar a linha da chave pública que já está presente dentro do arquívo "authorized_keys" para fazer isso editaremos o arquivo digitando no terminal o seguinte comando:
vi ~/.ssh/authorized_keys
Com o arquivo aberto dentro do editor de texto selecionaremos todo o conteúdo e colaremos por duas vesez o mesmo conteúdo no final do arquivo, podemos também usar a combinação das teclas "SHIFT+YYP" para obter três linhas idênticas. Feito isso iremos mudar o nome dos hosts que está no final de cada linha da seguinte maneira:
hadoop@hadoop-master
hadoop@hadoop-slave1
hadoop@hadoop-slave2
Obs.: fazer com cuidado para alterar somente a ultíma parte da linha onde está o nome do host.
Continuaremos copiando as chaves públicas dentro de cada nó inclusive no "localhost" de cada VM que irão formar o cluster
Obs.: esses comandos serão digitados somente no host "hadoop-master"
scp -rp ~/.ssh/ hadoop@localhost:~/
scp -rp ~/.ssh/ hadoop@hadoop-master:~/
scp -rp ~/.ssh/ hadoop@hadoop-slave1:~/
scp -rp ~/.ssh/ hadoop@hadoop-slave2:~/
Alterar as permissões em todos os hosts do cluster
Obs.: Sempre do host "hadoop-master" digitaremos os comandos abaixo:
ssh hadoop@localhost "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
ssh hadoop@hadoop-master "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
ssh hadoop@hadoop-slave1 "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
ssh hadoop@hadoop-slave2 "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
Pronto. Agora testaremos os acessos via ssh com chaves compartilhadas em todas as máquinas.
Obs.: Digitar esses 4 comandos em todos os nós
ssh localhost
(para sair digite exit ou ctrl+d)
ssh hadoop-master
(para sair digite exit ou ctrl+d)
ssh hadoop-slave1
(para sair digite exit ou ctrl+d)
ssh hadoop-slave2
(para sair digite exit ou ctrl+d)
Fazer o download do Apache Hadoop através do link abaixo: https://archive.apache.org/dist/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz
ou podemos usar o comando abaixo para salvar dentro da pasta "/tmp"
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz -P /tmp/
Acessando a máquina "hadoop-master" executar os seguintes comandos para descompactar o arquivo tar.gz do hadoop:
cd /tmp
tar xzvf hadoop-3.2.1.tar.gz
sudo su
mv hadoop-3.2.1 /hadoop
chown -R hadoop:hadoop /hadoop
exit
vi /hadoop/etc/hadoop/core-site.xml
inserindo entre as tags
<configuration>
</configuration>
as seguintes configurações;
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000/</value>
</property>
<property>
<!-- <name>dfs.permissions</name> old version-->
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/tmp</value>
</property>
vi /hadoop/etc/hadoop/hdfs-site.xml
inserindo entre as tags
<configuration>
</configuration>
as seguintes configurações:
<property>
<!--<name>dfs.secondary.http.address</name> old version-->
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
<description>Secondary NameNode hostname</description>
</property>
<property>
<!--<name>dfs.data.dir</name> old version-->
<name>dfs.datanode.data.dir</name>
<value>/hadoop/hdfs/datanode</value>
<final>true</final>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/hadoop/hdfs/namenode</value>
<final>true</final>
</property>
<property>
<name>dfs.blocksize</name>
<value>67108864</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
vi /hadoop/etc/hadoop/mapred-site.xml
inserindo entre as tags
<configuration>
</configuration>
as seguintes configurações:
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
vi /hadoop/etc/hadoop/yarn-site.xml
inserindo entre as tags:
<configuration>
</configuration>
as seguintes configurações:
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>256</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8040</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>512</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>256</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>256</value>
</property>
Obs.: essas configurações já existem no arquivo hadoop-env.sh devem ser somente alteradas de acordo com as linhas abaixo.
vi /hadoop/etc/hadoop/hadoop-env.sh
export JAVA_HOME="/usr/lib/jvm/jre-openjdk"
export HADOOP_CONF_DIR="/hadoop/etc/hadoop"
vi /hadoop/etc/hadoop/masters
Adicionando o nome abaixo;
hadoop-master
vi /hadoop/etc/hadoop/slaves
e adicione os nomes abaixo;
hadoop-slave1
hadoop-slave2
vi /hadoop/etc/hadoop/workers
hadoop-slave1
hadoop-slave2
mkdir -p /hadoop/logs
mkdir -p /hadoop/tmp
mkdir -p /hadoop/hdfs/namenode
mkdir -p /hadoop/hdfs/datanode
Cópia da pasta "hadoop" já configurada para todos os nós disponiveis.
Copiar a pasta já configurada para os todos os nós disponiveis a partir do nó "hadoop-master";
sudo su
scp -r /hadoop hadoop-slave1:/
scp -r /hadoop hadoop-slave2:/
exit
Nesse passo iremos mudar o proprietário da pasta hadoop dos nós lembrando que sempre estaremos executando os comandos no nó "hadoop-master".
Mudando o proprietário no nó "hadoop-slave1":
ssh -t hadoop-slave1 'sudo chown -R hadoop:hadoop /hadoop'
Mudando o proprietário no nó "hadoop-slave2":
ssh -t hadoop-slave2 'sudo chown -R hadoop:hadoop /hadoop'
Formatar e iniciar o cluster HDFS para poder acolher todos os nossos dados.
Obs.: Os comandos a seguir serão sempre executados no nó "hadoop-master"
hdfs namenode -format
Iniciar o serviço do Hadoop para poder inserir os primeiros arquívos
start-dfs.sh
Verificar se o cluster conseguiu iniciar sem erros
hdfs dfsadmin -report
se tudo funcionou esse comando irá retornar a capacidade e os nós ativos.
Executar o serviço "Yarn"
start-yarn.sh
Para monitorar se o cluster hadop está funcionando redondo podemos apontar o nosso browser para o seguinte endereço:
http://192.168.100.2:9870
Enquanto para monitorar o Yarn Resource manager será necessário apontar o nosso browser para o seguinte endereço:
http://192.168.100.2:8088
Iniciaremos com a criação de uma pasta dentro do nosso File System distribuído usando o comando:
hdfs dfs -mkdir -p /user/hadoop
e logo em seguida criaremos uma pasta dentro do nosso usuário hadoop que chamaremos de "livros" com esse comando:
hdfs dfs -mkdir -p /user/hadoop/livros
Para ver se foi criada corretamente digitar o comando:
hdfs dfs -ls /user/hadoop
Criamos agora um arquívo de texto a partir de um comando que gera muita saída de mensagems digitando o comando abaixo:
dmesg > ~/teste.txt
Iremos copiar o arquívo "teste.txt" dentro da pasta "livros" que foi criada antes
hdfs dfs -put ~/teste.txt /user/hadoop/livros
Para listar os arquivos contidos na pasta do hadoop iremos digitar:
hdfs dfs -ls /user/hadoop/livros
Agora iremos lêr o conteudo do arquívo teste que está no HDFS
hdfs dfs -cat livros/teste.txt
Com esse passo iremos copiar o arquivo teste.txt que está no HDFS para a pasta /tmp do nosso Sistema Operacional que hospeda o hadoop.
hdfs dfs -get livros/teste.txt /tmp
Vamos ver se isso aconteceu de fato digitano o comando:
ls -la /tmp/teste.txt
cat /tmp/teste.txt
Para mostrar o help dos comandos que o HDFS contém podem ser usados os seguintes comandos:
hdfs dfs -help
Para parar o serviço do hadoop é necessário digitar os comandos:
stop-yarn.sh
stop-all.sh
E por fim para será necessário desligar todas as VMs e faremos isso sempre executando os comandos a partir do nó "hadoop-master"
ssh -t hadoop-slave2 'sudo shutdown -h now'
ssh -t hadoop-slave1 'sudo shutdown -h now'
ssh -t hadoop-master 'sudo shutdown -h now'
Informações inerentes a essa matéria. Você pode consultar os seguintes recursos sobre este tópico. Embora sejam fornecidos com a esperança de que sejam úteis, observe que não podemos garantir a precisão ou a funcionalidade dos materiais hospedados externamente.
https://hadoop.apache.org/docs/r3.2.1/ https://hadoop.apache.org/docs/r3.2.1/hadoop-yarn https://hadoop.apache.org/docs/r3.2.1/FileSystemShell.html https://hadoop.apache.org/docs/r3.2.1/core-default.xml https://hadoop.apache.org/docs/r3.2.1/hdfs-default.xml https://hadoop.apache.org/docs/r3.2.1/mapred-default.xml https://hadoop.apache.org/docs/r3.2.1/yarn-default.xml