*ps: Este tutorial foi testado com o sistema operacional Ubuntu 16.04 e 14.04. Caso deseje configurar em uma versão mais antiga, recente ou em outro SO, pequenas mudanças podem ocorrer nos procedimentos apresentados.
O projeto Apache Hadoop é um software de código aberto mantido pela Apache Foundation que tem como propósito fornecer uma implementação de código aberto do modelo de programação MapReduce de forma confiável e escalável. O Hadoop é projetado para ampliar o processamento de um único servidor em milhares de máquinas, onde cada uma das máquinas oferecem poder de processamento e armazenamento local. Esta ferramenta é utilizada para processamento em batch de grandes volumes de dados (Big Data). Atualmente, o Apache Hadoop é uma das ferramentas mais conhecidas para processamento distribuído, mas existem outras ferramentas similares que se integram ao Hadoop, como o Apache Spark, Apache Storm e dentre outros.
*para mais informações a respeito do Apache Hadoop acessem o site http://hadoop.apache.org/
Neste tutorial você irá aprender a configurar o Apache Hadoop no modo Single Node. Montando um ambiente capaz de executar seus primeiros scripts em MapReduce.
Instale o Java 8 com o seguinte comando:~# apt-get install openjdk-8-jdk
Verifique a instalação do Java:~# java -version
Adicionar o JAVA_HOME na variável PATH:~# vim /etc/environments
Adicionar ao final do arquivo a variável JAVA_HOME:~# JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"
Atualize os índices da variável de ambiente:~# source /etc/environment
Verifique se o Path está correto:~# echo $JAVA_HOME
Caso não tenha instalado o ssh, instale o servidor ssh com o seguinte comando:~# apt-get install ssh
Verifique se a máquina tem acesso a ssh sem senha no localhost:~# ssh localhost
Caso seja solicitado uma senha, faça o seguinte procedimento:
Gere uma chave pública de acesso ao ssh~# ssh-keygen -t rsa -P ""
Agora com a chave gerada e adicione ela ao diretório de chaves autorizadas:~# cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
Faça o download do Apache Hadoop, neste caso a versão 2.8.1:~# wget http://mirror.nbtelecom.com.br/apache/hadoop/common/hadoop-2.8.1/hadoop-2.8.1.tar.gz
Descompacte o Apache Hadoop no diretório /opt:~# tar -zxvf hadoop-2.8.1.tar.gz
Agora configure as variáveis de ambiente:#caso você prefira que todos usuários do sistema tenham as variáveis de ambiente
~# vim /etc/profile
ou#caso você prefira que apenas o seu usuário tenham as variáveis de ambiente
~# vim ~/.bashrc
Adicione ao final do arquivo os seguintes variáveis de ambiente:#HADOOP VARIABLES START
export JAVA_HOME=caminho_para_o_java_home
export HADOOP_INSTALL=caminho_para_o_haddop
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_INSTALL/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_INSTALL/lib"
#HADOOP VARIABLES END
OBS: Substitua caminho_para_o_java_home e caminho_para_o_hadoop pelos seus respectivos paths ;)
Atualize os índices das variáveis de ambiente:~# source ~/.bashrc
ou~# source /etc/profile
Agora edite o arquivo de variáveis de ambiente do Hadoop:~# vim hadoop-2.8.1/etc/hadoop/hadoop-env.sh
Edite a variável de ambiente JAVA_HOME:~# export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
Crie o diretório onde será o ponto de montagem do sistemas de arquivos do Hadoop o HDFS:~# mkdir -p ~/hadoop_store/hdfs/namenode
~# mkdir -p ~/hadoop_store/hdfs/datanode
Configure o arquivo hdfs-site.xml com o caminho das pastas criadas:~# vim hadoop-2.8.1/etc/hadoop/hdfs-site.xml
Adicione as seguintes propriedades:<property>
<name>dfs.replication</name>
<value>1</value>
<description>Default block replication.
The actual number of replications can be specified when the file is created.
The default is used if replication is not specified in create time.
</description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:######NAMENODE_FOLDER_PATH######</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:######DATANODE_FOLDER_PATH######</value>
</property>
*ps: a tag </property>
deve ficar dentro de uma tag <configuration></configuration>
Crie um diretório temporário na pasta de instalação do Hadoop:~# mkdir -p ~/hadoop_store/hdfs/tmp
Configure o arquivo core-site.xml~# vim hadoop-2.8.1/etc/hadoop/core-site.xml
Adicione as seguintes propriedades<property>
<name>hadoop.tmp.dir</name>
<value>######TMP_FOLDER_PATH######</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:54310</value>
<description>The name of the default file system. A URI whose
scheme and authority determine the FileSystem implementation. The
uri's scheme determines the config property (fs.SCHEME.impl) naming
the FileSystem implementation class. The uri's authority is used to
determine the host, port, etc. for a filesystem.</description>
</property>
*ps: a tag </property>
deve ficar dentro de uma tag <configuration></configuration>
Configure o arquivo mapred-site.xml:~# cp hadoop-2.8.1/etc/hadoop/mapred-site.xml.template hadoop-2.8.1/etc/hadoop/mapred-site.xml
Adicione a seguinte propriedade:<property>
<name>mapred.job.tracker</name>
<value>localhost:54311</value>
<description>The host and port that the MapReduce job tracker runs
at. If "local", then jobs are run in-process as a single map
and reduce task.
</description>
</property>
*ps: a tag </property>
deve ficar dentro de uma tag <configuration></configuration>
Configure o arquivo o arquivo yarn-site.xml:~# vim yarn-site.xml
Adicione as seguintes propriedades:<property>
<name>yarn.resourcemanager.hostname</name>
<value>frontend</value>
<description>The hostname of the RM.</description>
</property>
<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>
*ps: a tag </property>
deve ficar dentro de uma tag <configuration></configuration>
Formate o sistema de arquivos HDFS:~# hadoop namenode -format
Inicie os serviços do Hadoop:~# start-dfs.sh && start-yarn.sh
Verifique os processos do Hadoop:~# jps
O console deve aparecer uma saída semelhante a essa:9757 Jps
8950 DataNode
9145 SecondaryNameNode
9438 NodeManager
8799 NameNode
9311 ResourceManager
Importante que apareça os processos *DataNode, SecondaryNameNode, NodeManager, NameNode e ResourceManager.
Caso enfrente algum problema com relação ao tamanho do heap de memória da JVM
1ª Etapa:
Adicione esta linha no arquivo /etc/profile:export JVM_ARGS="-Xms1024m -Xmx1024m"
Esta mudança muda o heap de memória do Java para 1024 mb. Por padrão é 128 mb.
Atualize os índices do arquivo /etc/profile:~# source /etc/profile
2ª Etapa:
Adicione ou edite a seguinte variável de ambiente:~# export HADOOP_CLIENT_OPTS="-Xmx1024m $HADOOP_CLIENT_OPTS"
3ª Etapa:
Adicione a seguinte propriedade ao arquivo mapred-site.xml:<property>
<name>mapred.child.java.opts</name>
<value>-Xmx1024m</value>
</property>
*ps: a tag </property>
deve ficar dentro de uma tag <configuration></configuration>
Se tudo estiver ok, pronto temos o Apache Hadoop configurado em modo Single Node ;)
O artigo Configuração do Apache Hadoop em Multi Node está disponível no seguinte link.
Material desenvolvido durante o meu Mestrado no Instituto de Ciências Matemáticas e de Computação da Universidade de São Paulo (ICMC-USP). Além disso, faço um agradecimento em especial ao Laboratório de Sistemas Distribuídos e Programação Concorrente (LaSDPC), o qual faço parte que me permitiu a criação deste material. Por fim, informo que é permitido livremente a reprodução integral deste material desde que sejam feitas as devidas referências ao autor ;)
[1] Apache Foundation. Hadoop: Setting up a Single Node Cluster. Acessado em Agosto de 2016. Disponível em: http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SingleCluster.html
[2] Rajesh N. “Java Heap space Out Of Memory Error” while running a mapreduce program. Acessado em Agosto de 2016. Disponível em: http://stackoverflow.com/questions/30295606/java-heap-space-out-of-memory-error-while-running-a-mapreduce-program