Carregando...
 

Configuração de um Cluster MultiNode com Hadoop 2.3.0 no ArchLinux

Instalação

  • Obter o HDFS via 'wget http://ftp.unicamp.br/pub/apache/hadoop/common/hadoop-2.3.0/hadoop-2.3.0.tar.gz'.
  • Descompactar em algum diretório, desde que seja o mesmo diretório em todas as máquinas do cluster.
  • A comunicação entre componentes do hadoop funciona de modo muito mais rápido se os hosts forem especificados através de nomes em vez de endereços IP. Para isso, certifique-se que os arquivos /etc/hosts de cada máquina do cluster contêm os nomes de todas as outras máquinas do cluster. Por exemplo:
10.103.17.9     namenode
10.103.17.10    datanode1
10.103.17.11    datanode2
10.103.17.39    datanode3
10.103.17.41    datanode4
  • Certifique-se que o hostname de cada máquina do cluster está ajustado no arquivo /etc/hostname.
  • Gere uma chave sem senha para autenticação SSH (o ideal, entretanto, é ter senha e utilizar o ssh-agent) e a envie para as chaves autorizadas de cada máquina do cluster:
[namenode]$ ssh-keygen -t rsa
<enter blank password>
[namenode]$ cat ~/.ssh/id_rsa.pub | ssh namenode 'cat >> .ssh/authorized_keys'
[namenode]$ scp ~/.ssh/authorized_keys datanode1:.ssh/
[namenode]$ scp ~/.ssh/authorized_keys datanode2:.ssh/
...
[namenode]$ scp ~/.ssh/authorized_keys datanodeN:.ssh/

Certifique que você consegue logar no SSH sem senha usando qualquer par de máquinas do cluster.

  • Configure a variável JAVA_HOME no arquivo etc/hadoop/hadoop-env.sh do name node (a linha já existe, você só deve mudar o valor).
  • No arquivo etc/hadoop/core-site.xml do namenode adicione as seguintes linhas de configuração:
<property>
    <name>fs.default.name</name>
    <value>hdfs://namenode:9000</value>
</property>
<property>
    <name>hadoop.tmp.dir</name>
    <value>/home/hadoop/hadoop-2.3.0/tmp</value>
</property>
  • No arquivo etc/hadoop/hdfs-site.xml do namenode adicione as seguintes linhas de configuração:
<property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/<caminho>/namenodedir</value>
</property>
<property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/<caminho>/datanodedir</value>
</property>

Exemplo:

<property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/home/hadoop/hadoop-2.3.0/namenodedir</value>
</property>
<property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/home/hadoop/hadoop-2.3.0/datanodedir</value>
</property>
  • No arquivo etc/hadoop/yarn-site.xml do namenode adicione as seguintes linhas de configuração:
<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>namenode</value>
</property>
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
  • Coloque o nome de todos os datanodes no arquivo etc/hadoop/slaves, um por linha.
  • Copie a configuração do namenode para todas as outras máquinas do cluster:
[namenode]$ scp -r etc/* datanode1:hadoop-2.3.0/etc/
[namenode]$ scp -r etc/* datanode2:hadoop-2.3.0/etc/
...
[namenode]$ scp -r etc/* datanodeN:hadoop-2.3.0/etc/
  • Formate (inicialize) o sistema de arquivos distribuí­do no NameNode com o comando (isso só precisa ser feito uma única vez):
[namenode]$ ./bin/hdfs namenode -format
  • Inicialize os serviços do HDFS do cluster com o comando:
[namenode]$ ./sbin/start-dfs.sh

Este comando irá inicializar os namenodes (primário e secundário) na máquina onde ele está sendo executado e um datanode em cada máquina presente no arquivo etc/hadoop/slaves.

  • Inicialize os serviços do YARN do cluster com o comando:
[namenode]$ ./sbin/start-yarn.sh

Este comando irá inicializar o resourcemanager na máquina onde ele está sendo executado e um nodemanager em cada máquina presente no arquivo etc/hadoop/slaves.

  • Utilize o comando 'jps' em cada máquina para verificar se os processos foram iniciados.
  • No browser, acesse o endereço http://<ip-do-namenode>:50070/ e verifique se todos os DataNodes foram identificados.
  • No browser, acesse o endereço http://<ip-do-namenode>:8088/cluster/nodes e verifique se todos os NodeManagers foram identificados.
  • Se você quiser, inicialize o History Server com o comando:
[namenode]$ ./sbin/mr-jobhistory-daemon.sh start historyserver

Verifique no browser o history server no endereço http://<ip-do-namenode>:19888/jobhistory/app.

Execução de um job de teste

  • Se você executar um job com a configuração default do hadoop ele irá executar o job localmente. Para realizar a execução no grid você precisa informar que o job deverá ser executado sobre o yarn. Altere o arquivo etc/hadoop/mapred-site.xml do namenode e acrescente a seguinte propriedade:
<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>

Lembre-se de copiar esta configuração para todas as outras máquinas do cluster. Provavelmente você precisará reinicializar os serviços do YARN e HDFS para que a configuração passe a fazer efeito (será ?).

  • O hadoop vem com um conjunto de exemplos. Um deles é o TeraSort, que traz utilitários para geração de um dataset grande de dados, para posterior ordenação. Gere um dataset com o comando:
[namenode]$ ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.3.0.jar teragen 10000000 /data/

Este job irá gerar 10.000.000 de registros na pasta /data/ do sistema de arquivos distribuí­dos.

  • Execute agora o job de ordenação com o comando:
[namenode]$ ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.3.0.jar terasort /data/ /output/

Este job irá ordenar os dados presentes em /data/ e gerar a saí­da em /output/.

Opções de Configuração

  • Para verificar a replicação de dados, execute algum comando do HDFS, por exemplo para criar uma pasta no sistema de arquivos distribuí­dos:
[namenode]$ ./bin/hadoop fs -mkdir /users
  • Aguarde algum momento para sincronizar e verifique que os dados foram replicados executando o seguinte comando em alguma máquina DataNode:
[namenode]$ ./bin/hadoop fs -ls /
  • Note que, o número de DataNodes que irá conter a informação aparentemente depende da valor configurado no arquivo hdfs-site.xml:
<property>
    <name>dfs.replication</name>
    <value>1</value>
</property>
  • O valor default para dfs.replication aparentemente é 3, portanto somente três DataNode's iriam conter réplicas da informação criada (necessário verificar experimentalmente)