Introdução
Essa semana na minha aula de especialização, fizemos a instalação do Apache Hadoop. Vou repassar o procedimento aqui, instalando para uso apenas em nossa em uma máquina (cluster single-node ou Pseudo-Distributed Mode).
Refiz o procedimento algumas vezes com versões diferentes para integração posterior com o Apache Spark, o Apache Flume, o Apache Oozie, e o Hive.
Em outro tutorial, pretendo usar estes três últimos para fazermos um teste com a Twitter Streaming API.
#1 – Validando o Java
Primeiro precisamos ter instalado uma versão do Java. Para essa versão do Hadoop, precisamos da versão 8 do SDK. Vamos testar se o SO possui alguma versão instalada através do comando:
[raw]
# java -version
java version “1.8.0_101”
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
[/raw]
#2 – Criando usuário Hadoop
É recomendado criar uma conta de usuário sem privilégios (não root) para uso do Hadoop. Para criar uma conta de sistema usamos o comando abaixo:
[raw]
# adduser hadoop
# passwd hadoop
[/raw]
Após criarmos uma conta, vamos definir uma chave ssh para essa conta. Para fazer isso execute o comando abaixo:
[raw]
# su – hadoop
$ ssh-keygen -t rsa -P “”
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
[/raw]
Vamos conectar no serviço SSH pela primeira vez para adicionar uma permissão definitiva para a chave que acabamos de criar:
[raw]
$ ssh localhost
$ exit
[/raw]
#3 – Baixando Hadoop 2.8.0
Para esse tutorial vamos usar a versão 2.8.0 do hadoop, que pode ser baixado do site do Hadoop, ou pelos comandos abaixo:
[raw]
$ cd ~
$ wget http://ftp.unicamp.br/pub/apache/hadoop/common/hadoop-2.8.0/hadoop-2.8.0.tar.gz
$ tar xzf hadoop-2.8.0.tar.gz
$ mv hadoop-2.8.0 hadoop
[/raw]
#4 – Configurando em Pseudo-Distributed Mode (Falso Distribuido)
Variáveis de Ambiente
Vamos definir as variáveis de ambiente para uso do Hadoop. Vamos editar o arquivo ~/.bashrc e adicionar as novas variáveis.
[raw]
vi ~/.bashrc
[/raw]
Insira o conteúdo abaixo.
1 2 3 4 5 6 7 8 9 10 11 |
# Define JAVA_HOME here or in s export JAVA_HOME=/opt/jdk1.8.0_131/ export HADOOP_HOME=/home/hadoop/hadoop export HADOOP_INSTALL=$HADOOP_HOME export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin |
Vamos agora recarregar a ativar as novas variáveis.
[raw]
source ~/.bashrc
[/raw]
Note que a variável JAVA_HOME, poderá ser inserida nesse ponto para ser usada de forma geral por todas as aplicações java que não definirem a própria JVM. No caso do hadoop, poderemos definir de forma isolada através do arquivo hadoop-env.sh.
Abra o arquivo:
[raw]
vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh
[/raw]
Descomente e ajuste a linha abaixo:
1 |
export JAVA_HOME=/opt/jdk1.8.0_131/ |
Arquivos de Configuração
Vamos ajustar os arquivos de configuração do Hadoop que definem como será a infraestrutura do Hadoop. Vamos iniciar configurando ele para rodar em modo single-node.
Entre na pasta:
[raw]
$ cd $HADOOP_HOME/etc/hadoop
[/raw]
Editar core-site.xml
Esse arquivo serve para que o hadoop saiba quem é o servidor master do cluster, ou seja, o servidor namenode, nesse caso estamos ajustando para que seja a própria máquina.
1 2 3 4 5 6 |
<configuration> <property> <name>fs.default.name</name> <value>hdfs://localhost:9000</value> </property> </configuration> |
Editar hdfs-site.xml
Esse arquivo definir como o HDFS vai gerenciar os arquivos.
dfs.replication define a quantidade de réplicas dos clusters.
dfs.namenode.name.dir 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.name.dir</name> <value>file:///home/hadoop/hadoopdata/hdfs/namenode</value> </property> <property> <name>dfs.data.dir</name> <value>file:///home/hadoop/hadoopdata/hdfs/datanode</value> </property> </configuration> |
Editar mapred-site.xml
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 editá-lo.
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.
1 2 3 4 5 6 7 8 9 10 |
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>namenode:19888</value> </property> </configuration> |
Editar yarn-site.xml
Agora é necessário editar o yarn-site.xml, o conteúdo dele deve ser parecido com o abaixo.
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.
1 2 3 4 5 6 |
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> |
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.
Formatar Namenode
Vamos formatar o namenode usando o seguinte comando:
[raw]
$ hdfs namenode -format
[/raw]
Resultado do comando deverá ser algo assim:
[raw]
17/08/24 12:58:43 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = localhost/127.0.0.1
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.8.0
…
…
17/08/24 12:58:57 INFO common.Storage: Storage directory /home/hadoop/hadoopdata/hdfs/namenode has been successfully formatted.
17/08/24 12:58:57 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
17/08/24 12:58:57 INFO util.ExitUtil: Exiting with status 0
17/08/24 12:58:57 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/127.0.0.1
************************************************************/
[/raw]
Vamos criar os diretórios HDFS necessários usando os seguintes comandos:
[raw]
$ hdfs dfs -mkdir /user
$ hdfs dfs -mkdir /user/hadoop
[/raw]
#5 – Iniciando o Hadoop Cluster
Vamos iniciar o nosso Cluster Hadoop, usando os scritps que são fornecidos pelo Hadoop. Vamos acessar o diretório sbin, e executar um comando de cada vez:
[raw]
$ cd $HADOOP_HOME/sbin/
[/raw]
Execute agora o script start-dfs.sh:
[raw]
$ start-dfs.sh
[/raw]
Exemplo do resultado do comando:
[raw]
17/08/24 13:00:34 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
Starting namenodes on [localhost]
localhost: starting namenode, logging to /home/hadoop/hadoop/logs/hadoop-hadoop-namenode-localhost.localdomain.out
localhost: starting datanode, logging to /home/hadoop/hadoop/logs/hadoop-hadoop-datanode-localhost.localdomain.out
Starting secondary namenodes [0.0.0.0]
The authenticity of host ‘0.0.0.0 (0.0.0.0)’ can’t be established.
RSA key fingerprint is 3c:c4:f6:f1:72:d9:84:f9:71:73:4a:0d:55:2c:f9:43.
Are you sure you want to continue connecting (yes/no)? yes
0.0.0.0: Warning: Permanently added ‘0.0.0.0’ (RSA) to the list of known hosts.
0.0.0.0: starting secondarynamenode, logging to /home/hadoop/hadoop/logs/hadoop-hadoop-secondarynamenode-localhost.localdomain.out
17/08/24 13:01:15 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
[/raw]
Execute agora o script start-yarn.sh:
[raw]
$ start-yarn.sh
[/raw]
Exemplo do resultado do comando:
[raw]
starting yarn daemons
starting resourcemanager, logging to /home/hadoop/hadoop/logs/yarn-hadoop-resourcemanager-localhost.localdomain.out
localhost: starting nodemanager, logging to /home/hadoop/hadoop/logs/yarn-hadoop-nodemanager-localhost.localdomain.out
[/raw]
Vamos verificar se o cluster esta rodando através do comando jps
[raw]
# jps
5298 DataNode
5092 NameNode
5734 ResourceManager
5542 SecondaryNameNode
14024 Bootstrap
5899 NodeManager
6111 Jps
[/raw]
Se os seis serviços aparecerem, o seu cluster está OK.
#6 – Acessando o Hadoop no Navegador
Hadoop NameNode inicia na porta 50070 por padrão. Acesse o servidor no seu navegador preferido:
[raw]
http://localhost:50070/
[/raw]
Vamos acessar a porta 8088 para obter as informações sobre o cluster e todas as aplicações.
[raw]
http://localhost:8088/
[/raw]
Acesse a porta 50075 para obter os detalhes do DataNode
[raw]
http://localhost:50075/
[/raw]
Podemos ver o conteúdo da pasta que criamos:
[raw]
http://localhost:50070/explorer.html#/user/
[/raw]
Marcel, tudo bem? Eu estou configurando ele no Windows e consigo subir todos os Daemons e subir arquivos pela linha de comando HDFS, porém não consigo subir arquivos para o DFS pela webpage localhost:50070, ele retorna um erro de permissão para o user Dr.Who. Saberia me informar o que posso fazer para conseguir subir os dados sem ser por linha de comando?