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/.
- Verifique em http://<ip-do-namenode>:8088/cluster/apps/FINISHED se o job foi finalizado com sucesso. Ele deve aparecer também no History Server.
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)