Guia passo a passo para criar um cluster Hadoop com 3 nodes
Nesse post vou explicar como é possível criar um cluster de hadoop utilizando 3 nodes. Já o que você vai fazer com o hadoop depois é um assunto pra um outro post.
O Hadoop é um framework para se trabalhar com bigdata, ele possui um recursos chamado hdfs que armazena qualquer tipo de arquivo para que você possa fazer a análise posteriormente e um outro chamado YARN que é um framework de mapreduce, basicamente só com isso você já consegue colocar um hadoop pra rodar. Então vamos lá.
Instalação e preparação
Um hadoop clusterizado é basicamente 1 namenode, que é o cara que faz a gerencia dos nodes e de tudo que está sendo processado e de 1 ou mais datanodes, esses são os servidores que vão armazenar os dados que você colocar no hdfs.
Nesse cluster estou utilizando 3 máquinas rodando o CentOS 7.
Os comandos abaixo estão sendo executados na máquina master (namenode).
[root@localhost ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.0.107 namenode 192.168.0.108 datanode1 192.168.0.109 datanode2
Acima é o /etc/hosts do meu servidor master, que será responsável por executar as jobs e buscar os dados nos datanodes.
O Hadoop vai fazer o setup das máquinas via ssh, então é necessário gerar uma chave no seu sevidor master e copiar essa chave para todos os datanodes, inclusive para o próprio master.
[root@localhost ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa):
Ao executar o comando acima, ssh-keygen, é só ir dando enter que a sua chave será gerada.
Na sequencia copie essa chave para todos os servidores.
[root@localhost ~]# ssh-copy-id namenode /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@namenode's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'namenode'" and check to make sure that only the key(s) you wanted were added. [root@localhost ~]# ssh-copy-id datanode1 /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@datanode1's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'datanode1'" and check to make sure that only the key(s) you wanted were added. [root@localhost ~]# ssh-copy-id datanode2 /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@datanode2's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'datanode2'" and check to make sure that only the key(s) you wanted were added. [root@localhost ~]#
Agora que a chave já foi copiada para todos os servidores, faça a cópia do /etc/hosts também.
[root@localhost ~]# scp /etc/hosts root@namenode:/etc/hosts hosts 100% 229 0.2KB/s 00:00 [root@localhost ~]# scp /etc/hosts root@datanode1:/etc/hosts hosts 100% 229 0.2KB/s 00:00 [root@localhost ~]# scp /etc/hosts root@datanode2:/etc/hosts hosts 100% 229 0.2KB/s 00:00 [root@localhost ~]#
Agora faça o download do java dentro do servidor: http://www.oracle.com/technetwork/pt/java/javase/downloads/jdk8-downloads-2133151.html
Uma vez baixado decompacte-o dentro do /opt.
[root@localhost ~]# tar -xf jdk-8u121-linux-x64.tar.gz [root@localhost ~]# mv jdk1.8.0_121/ /opt/java
Agora faça o download do hadoop:
[root@localhost ~]# wget http://ftp.unicamp.br/pub/apache/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz [root@localhost ~]# tar -xf hadoop-2.7.3.tar.gz [root@localhost ~]# mv hadoop-2.7.3 /opt/hadoop
Nas linhas acima o hadoop foi baixado e movido para o /opt.
Configuração do cluster
Uma vez com tudo baixado é hora de configurar o ambiente, para isso é necessário editar o /etc/profile e adicionar as seguintes linhas:
[root@localhost ~]# vim /etc/profile # adicione as linhas abaixo dentro do /etc/profile, eu coloquei logo no inicio do arquivo export JAVA_HOME=/opt/java export HADOOP_HOME=/opt/hadoop export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export YARN_HOME=$HADOOP_HOME PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
Agora copie esse arquivo para todas as máquinas do cluster.
[root@localhost ~]# scp /etc/profile root@datanode1:/etc/profile profile 100% 2062 2.0KB/s 00:00 [root@localhost ~]# scp /etc/profile root@datanode2:/etc/profile profile 100% 2062 2.0KB/s 00:00 [root@localhost ~]#
Agora todas as máquinas já tem as variáveis de ambiente configuradas.
Feito isso vamos configurar o hadoop.
Entre no diretório /opt/hadoop/etc/hadoop.
[root@localhost ~]# cd /opt/hadoop/etc/hadoop/ [root@localhost hadoop]# ls capacity-scheduler.xml hadoop-env.sh httpfs-env.sh kms-env.sh mapred-env.sh slaves yarn-site.xml configuration.xsl hadoop-metrics2.properties httpfs-log4j.properties kms-log4j.properties mapred-queues.xml.template ssl-client.xml.example container-executor.cfg hadoop-metrics.properties httpfs-signature.secret kms-site.xml mapred-site.xml ssl-server.xml.example core-site.xml hadoop-policy.xml httpfs-site.xml log4j.properties mapred-site.xml.template yarn-env.cmd hadoop-env.cmd hdfs-site.xml kms-acls.xml mapred-env.cmd masters yarn-env.sh [root@localhost hadoop]#
Dentro desse diretório existem uma série de configurações.
Os que vamos precisar mexer são:
- core-site.xml
- hdfs-site.xml
- mapred-site.xml
- yarn-site.xml
- hadoop-env.sh
O primeiro a ser editado é o core-site.xml
Abrindo esse arquivo deve haver uma seção chamada configuration, ela deve ficar da seguinte maneira:
fs.defaultFS hdfs://namenode:8082
Esse arquivo serve para que o hadoop saiba quem é o servidor master do cluster, ou seja, o servidor namenode.
Agora o arquivo a ser editado é o hdfs-site.xml, ele segue a mesma lógica, vai haver uma seção configuration, que você deve deixar o seguinte conteúdo.
dfs.namenode.name.dir file:/opt/hadoop/hdfs/namenode dfs.datanode.data.dir file:/opt/hadoop/hdfs/datanode dfs.replication 2
dfs.namenode.name.dir vai define onde serão gravados os metadados que o namenode usa para gerenciar o cluster.
dfs.datanode.data.dir define onde serão armazenados os arquivos dentro do hdfs.
dfs.replication define a quantidade de replicas dos clusters.
Agora vamos editar o mapred-site.xml, esse arquivo não existe por padrão, é necessário copiar o mapred-site.xml.template e depois edita-lo.
mapreduce.framework.name yarn mapreduce.jobhistory.webapp.address namenode:19888
mapreduce.framework.name define qual será o framework de mapreduce que você vai utilizar par analisar os dados.
mapreduce.jobhistory.webapp.address define o endereço onde serão guardados o histórico das jobs.
Agora é necessário editar o yarn-site.xml, o conteúdo dele deve ser parecido com o abaixo.
yarn.resourcemanager.hostname namenode yarn.resourcemanager.bind-host 0.0.0.0 yarn.nodemanager.bind-host 0.0.0.0 yarn.nodemanager.aux-services mapreduce_shuffle yarn.nodemanager.remote-app-log-dir hdfs://namenode:8020/var/log/hadoop-yarn/apps
yarn.resourcemanager.hostname define qual é o hostname do seu servidor com yarn
yarn.resourcemanager.bind-host define quais endereço o yarn irá ouvir
yarn.nodemanager.bind-host define quais endereços podem se conectar como nodes do yarn
yarn.nodemanager.aux-services define o serviço que vai fazer o shuffle dos dados do hadoop
yarn.nodemanager.remote-app-log-dir define onde ficarão os logs do yarn.
Nesse post eu não expliquei muito sobre a parte teórica do hadoop pois isso é encontrado facilmente na internet, já essa instalação de cluster dá um pouco mais de trabalho.
Essa questão do shuffle é quando você aplica um algoritmo de mapreduce, por exemplo, em todas as pastas do cluster eu quero saber a ocorrência das palavras dentro dos arquivos, essa busca é feita em todos os datanodes e esse shuffle mistura os dados trazendo um único resultado, mais pra frente vou fazer um post explicando como isso funciona.
Com todos os arquivos xml já configurados, abra o arquivo slaves, esse arquivo não tem extensão mesmo, dentro dele adicione os seus datanodes.
[root@localhost hadoop]# vim slaves #conteudo datanode1 datanode2
Crie um arquivo chamado masters, dentro da mesma pasta.
[root@localhost hadoop]# vim masters #conteudo namenode
Seu hadoop já está quase pronto pra rodar, todas as configurações já foram feitas.
Mas lembrando que no arquivo do hdfs, foram definidos alguns diretórios onde o hadoop irá armazenar os dados e os metadados, sendo assim é necessário criar esses diretorios.
[root@localhost hadoop]# mkdir /opt/hadoop/hdfs/datanode -p [root@localhost hadoop]# mkdir /opt/hadoop/hdfs/namenode -p
Como é um laboratório de hadoop que estou fazendo vou parar o firewall de todos nodes, mas em um servidor de produção é ideal você liberar as portas do hadoop.
[root@localhost hadoop]# ssh root@namenode "systemctl stop firewalld" [root@localhost hadoop]# ssh root@datanode1 "systemctl stop firewalld" [root@localhost hadoop]# ssh root@datanode2 "systemctl stop firewalld"
É necessário também editar arquivo hadoop-env.sh nesse arquivo é basicamente editar a linha export JAVA_HOME e colocar JAVA_HOME=/opt/java .
Agora copie o /opt para todos os nodes.
[root@localhost hadoop]# scp -r /opt/ root@datanode1:/opt/ [root@localhost hadoop]# scp -r /opt/ root@datanode2:/opt/
Fazendo o scp do /opt direto ele irá copiar tanto o java quanto o hadoop que estão no mesmo diretório.
Agora formate o filesystem dentro do seu namenode com o seguinte comando:
hdfs namenode -format 17/03/12 21:38:54 INFO common.Storage: Storage directory /opt/hadoop/hdfs/namenode has been successfully formatted.
O log desse format é gigantesco, mas a única mensagem que importa é essa mensgem acima, se ela aparecer é por que tudo ocorreu com sucesso.
Com todos os arquivos copiados e o filesystem formatado, pode-se iniciar o serviço do hadoop, para inicia-lo execute o comando abaixo.
[root@localhost hadoop]# start-dfs.sh Starting namenodes on [namenode] namenode: starting namenode, logging to /opt/hadoop/logs/hadoop-root-namenode-localhost.localdomain.out datanode2: starting datanode, logging to /opt/hadoop/logs/hadoop-root-datanode-localhost.localdomain.out datanode1: starting datanode, logging to /opt/hadoop/logs/hadoop-root-datanode-localhost.localdomain.out Starting secondary namenodes [0.0.0.0] 0.0.0.0: starting secondarynamenode, logging to /opt/hadoop/logs/hadoop-root-secondarynamenode-localhost.localdomain.out [root@localhost hadoop]#
Agora inicie o yarn.
[root@localhost hadoop]# start-yarn.sh starting yarn daemons starting resourcemanager, logging to /opt/hadoop/logs/yarn-root-resourcemanager-localhost.localdomain.out datanode2: starting nodemanager, logging to /opt/hadoop/logs/yarn-root-nodemanager-localhost.localdomain.out datanode1: starting nodemanager, logging to /opt/hadoop/logs/yarn-root-nodemanager-localhost.localdomain.out [root@localhost hadoop]#
Se as mensagens foram similares a essas o seu cluster pode já estar rodando.
Testes finais
Para garantir que ele está clusterizado execute os seguintes comandos:
[root@localhost hadoop]# jps 14944 Jps 14241 NameNode 14674 ResourceManager 14427 SecondaryNameNode [root@localhost hadoop]#
A saída do servidor master deve ser essa, pois nele só deve conter o namenode rodando, nos outros servidores deve ser a seguinte:
[root@localhost hadoop]# ssh root@datanode1 Last login: Sun Mar 12 20:26:25 2017 from namenode [root@localhost ~]# jps 9452 DataNode 9976 NodeManager 10124 Jps
No datanode2 deve ser a mesma coisa.
Agora para testar criar e colocar um arquivo dentro do seu cluster você pode executar os seguintes comandos.
[root@localhost hadoop]# hdfs dfs -mkdir /bigdata [root@localhost hadoop]# [root@localhost ~]# touch arquivo.txt [root@localhost ~]# hadoop fs -put arquivo.txt /bigdata/arquivo.txt [root@localhost ~]# hadoop fs -ls /bigdata/ Found 1 items -rw-r--r-- 2 root supergroup 0 2017-03-12 21:47 /bigdata/arquivo.txt [root@localhost ~]#
O Hadoop também tem algumas páginas que você pode ver informações sobre o seu cluster, por exemplo:
Interface do Yarn roda na porta 8088.
http://192.168.0.107:8088/cluster/nodes
Na porta 50070 você o status do seu cluster.
http://192.168.0.107:50070/dfshealth.html#tab-overview
E tem o explorer para você navegar dentro dos arquivos do cluster:
http://192.168.0.107:50070/explorer.html#/
About author
Você pode gostar também
Automatizando Tarefas com Shell Script
Já se aventurou pela linha de comando de sistemas Unix ou Linux? Se sua resposta for sim, então provavelmente já ouviu falar de Shell Script. Mas o que seria exatamente
Gerenciamento eficiente de infraestrutura Docker com Portainer.io
O gerenciamento de uma infraestrutura com docker se dá quase que exclusivamente via terminal, mas quando surge a necessidade de apresentar a infraestrutura para a equipe, ou para toda a
Aprenda a criar módulos com Terraform na prática
Este seria o último capítulo da nossa série de postagens sobre Terraform, mas se podemos também falar sobre versionamento de infraestrutura, acho que vale a pena no aprofundarmos em mais