Cluster Hadoop: aprenda a configurar

Cluster Hadoop: aprenda a configurar

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á.

Hadoop Cluster

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#/

Anterior Rundeck, bom para projetos DevOps
Próxima Backup PITR centralizado com Barman

About author

Alisson Machado
Alisson Machado 15 posts

Alisson Menezes, atua como Gerente de T.I, 9 anos de experiência em projetos FOSS (Free and Open Source Software) e Python. Formação em Análise de Sistemas pela FMU e cursando MBA em BigData pela FIA, possui certificações LPI1, LPI2 e SUSE CLA, LPI DevOps e Exim - DevOps Professional. Autor dos cursos Python Fundamentals, Python for Sysadmins, MongoDB for Developers/DBAs, DevSecOps, Co-Autor do Infraestrutura Ágil e Docker da 4Linux e palestrantes em eventos como FISL, TDC e Python Brasil. É entusiasta das mais diversas áreas em T.I como Segurança, Bancos de dados NoSQL, DataScience mas tem como foco DevOps e Automação.

View all posts by this author →

Você pode gostar também

Infraestrutura

MongoDB: como criar um Cluster Replication Set

O MongoDB é um banco com foco em escalabilidade horizontal, sendo assim ele possui um recurso chamado ReplicatSet que serve para replicar os dados em um cluster de servidores para

Infraestrutura

Backup PITR centralizado com Barman

O backup PITR(Point-In-Time-Recovery) que é uma ferramenta que permite um arquivamento contínuo das transações ocorridas no banco, para que seja possível a recuperação de qualquer posição dos dados desde o

Infraestrutura

MongoDB Aggregation

Descubra como processar documentos distintos agrupados em uma única saída para facilitar a geração de resultados e performance quando preciso efetuar buscas em banco de dados MongoDB A seguir explicarei