Este documento foi elaborado, com informações básicas sobre como você pode preparar um ambiente de testes Apache Hadoop, usando um container Docker em sua máquina local.
Construir um ambiente de desenvolvimento e testes em um container Docker local não será uma tarefa fácil, mas nos permitirá, estudar, aprender, depurar erros, assim como, executar aplicações de análise de dados que forem propostas nas aulas do curso de Formação Cientista de Dados da Data Science Academy.
O curso de Formação Cientista de Dados explica passo-a-passo como instalar e configurar em uma VM VirtualBox com Linux CentOS, o Apache Hadoop e alguns dos produtos do seu Ecossistema.
Objetivo deste documento, é ajudar na instalação e configuração manual de um container Docker Apache Hadoop, em modo Pseudo-Distribuído (Pseudo-Distributed).
No final desta jornada, teremos um ambiente de testes para estudos, onde será produtivo experimentar um framework para soluções de Big Data, tanto para armazenamento, quando processamento de dados distribuído.
Esta é uma sugestão de uma configuração inicial para uso em máquinas de testes. Não implemente em ambiente de produção.
- Máquina com arquitetura 64Bits e sistema operacional Linux instalado;
- Você precisa ter o Docker instalado em sua máquina local;
- Noções básicas do funcionamento do Docker;
Quando estiver trabalhando no container, não use o comando exit para sair do console, se fizer seu container morre e você perderá todos os pacotes instalados até este ponto.
Use o seguinte atalho do teclado:
Assim, você sairá do container e ele continuará em execução.
$ docker attach <ID do Container> (voltar ao container)
Na ilustração acima, os ambientes, máquina local e container Docker estão isolados, apesar de compartilharem dos recursos de equipamento físico da máquina local.
- Baixe uma imagem Docker da distribuição Linux CentOS;
$ docker pull centos
- Caso você tenha uma imagem local, use a instrução:
$ docker pull localhost:5000/centos
- Para subir um container em modo interativo, use instrução:
$ docker container run -ti localhost:5000/centos
- Caso sua imagem esteja local, use a instrução:
$ docker container run -ti centos
Instalaremos alguns utilitários, pacotes adicionais e configuraremos o serviço SSH. Execute as instruções abaixo:
$ yum update -y
$ yum install kernel -y
$ yum install kernel-devel -y
$ yum install kernel-headers -y
$ yum install initscripts -y
$ yum install gcc -y
$ yum install make -y
$ yum install perl -y
$ yum install ncurses -y
$ yum install bzip2 -y
$ yum install unzip -y
$ yum install rsync -y
$ yum install wget -y
$ yum install net-tools -y
$ yum install nano -y
$ yum install iproute -y
$ yum install passwd -y
$ yum install sudo -y
$ yum install openssh-server -y
$ yum install openssh-clients -y
Edite o arquivo /etc/ssh/sshd_config e ajuste os seguintes parâmetros:
Port 22
ListemAdress 0.0.0.0
PermitRootLogin No
AllowUsers hadoop
Editaremos com o nano, mas pode ser usado qualquer editor.
$ sudo nano /etc/ssh/sshd_config
Continuando...
Para gravar as alterações, use o atalho do teclado: (Ctrl + x + Y)
Com usuário administrador root execute as instruções abaixo:
$ adduser santana (cria usuário de trabalho)
$ adduser hadoop (cria usuário de administração)
$ passwd santana
$ passwd hadoop
Edite o arquivo sudoers e ajuste as permissões do usuário hadoop, idênticas ao do usuário root no arquivo.
$ sudo nano /etc/sudoers
Para gerar uma chave SSH em seu servidor Linux, execute o comando ssh-keygen
.
$ ssh-keygen -A
Verifique o acesso ssh localhost, é possível acessar sem uma senha? execute a instrução abaixo:
$ ssh localhost
No console, não foi possível acessar sem uma senha. O Apache Hadoop precisa que o acesso seja via SSH e sem senha.
Para resolver esse problema, execute as instruções abaixo:
$ su hadoop
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
$ sudo rm /run/nologin
Verifique o acesso com o usuário root.
$ su root
$ ssh localhost
Correto! o usuário root não tem permissão para acesso remoto no serviço.
Verifique o acesso com o usuário hadoop.
$ su hadoop
$ ssh localhost
Funcionou! o usuário hadoop tem acesso sem senha no ssh, agora podemos continuar a instalação do Apache Hadoop.
A partir deste ponto, você pode acessar o container via comandos docker attach
ou ssh
.
Para descobrir o IP do container use a instrução docker inspect <ID do Container>
.
Agora que finalizamos a primeira etapa da preparação do ambiente, enviaremos uma imagem customizada do container CentOS, para o repositório local. .
Lembre-se, para sair do container e deixá-lo ainda em execução, é necessário pressionar Crtl + p + q.
$ docker container ls
Listaremos os containers em execução para descobrir qual é o ID do CONTAINER que estamos customizando.
$ docker commit -m "Apache Hadoop" <ID do Container>
Imagem gerada com sucesso! agora enviaremos a imagem para o repositório local. (Backup)
$ docker image ls
A imagem customizada foi gerada, agora renomearemos a TAG e o repositório.
$ docker tag 6361bba42a00 localhost:5000/centos:8.0
Feito! a imagem foi renomeada, agora vamos enviá-la para o repositório Docker Local.
$ docker push localhost:5000/centos:8.0
Pronto! imagem arquivada com sucesso.
Criaremos Volumes Docker para compartilharmos arquivos com a máquina local.
Para criar um volume, execute as instruções abaixo:
$ docker volume create datasets
$ docker volume create hadoop_home
Os volumes foram criados, agora subiremos nova instância do container customizada para acesso às pastas.
Para exibir os containers ativos, execute as instruçôes abaixo:
$ docker ps
$ docker stop 6aa313b91f6d
O container foi encerrado. Agora, subiremos o novo container com os acessos compartilhados.
Para instanciar o novo container, execute a instrução abaixo:
$ docker container run -ti \
--mount type=volume,source=datasets,destination=/opt \
--mount type=volume,source=hadoop_home,destination=/home/hadoop \
localhost:5000/centos:8.0
Pronto, o novo container foi criado. Testaremos os compartilhamentos de arquivos.
Para descobrir onde os volumes foram criados na máquina local, digite no console da máquina local a instrução abaixo:
$ docker inspect datasets
Acesse cd /var/lib/docker/volumes/datasets/_data
padronize neste diretório, cópia de todos os pacotes do Apache Hadoop baixados.
Para testarmos o mapeamento, faça uma copia do JDK para o diretório.
$ docker inspect hadoop_home
Acesse cd /var/lib/docker/volumes/hadoop_home/_data
Este será um diretório persistente do usuário hadoop.
Para logar no container com usuário hadoop, digite no console do container su hadoop
Precisamos instalar o Java 8 porque alguns pacotes do Apache Hadoop, não são compatíveis com versões superiores do JDK.
Faça o download do pacote JDK no site da Oracle para sua máquina local e depois copie o pacote para:
/var/lib/docker/volumes/datasets/_data
Eu vou usar o pacote TAR para a customização e padronização do ambiente.
O Java 1.8 foi baixado e copiado para o diretóriodatasets
na máquina local que é o diretório /opt
no container Hadoop, esta customização nos permitirá agilidade na troca de arquivos entre os ambientes de teste e desenvolvimento.
- Para instalar o java você precisa descompactar o arquivo jdk-8u281-linux-x64.tar.gz em /opt e configurar as variáveis de ambiente.
Para instalar o JDK execute a sequencia de instruções abaixo, no console do container:
$ su hadoop
$ cd /opt
$ sudo tar xvf jdk-8u281-linux-x64.tar.gz
$ sudo chown hadoop:hadoop -R jdk1.8.0_281/
$ sudo mv jdk1.8.0_281/ jdk/
$ sudo chmod 775 -R jdk
Feito, o java foi copiado para /opt, a nomenclatura e as permissões foram ajustadas. Agora configuraremos as variáveis de ambiente e testaremos.
Edite o arquivo .bashrc e inclua as variáveis de ambiente do JAVA (JDK)
Execute a sequencia de instruções abaixo:
$ cd
$ nano .bashrc (nano é um editor de texto leve e amigável para o Shell do Linux)
# JAVA
export JAVA_HOME=/opt/jdk
export PATH=$PATH:$JAVA_HOME/bin
$ source .bashrc
Testaremos e verificaremos se o Java (JDK) foi instalado corretamente.
O java 1.8 foi instalado com sucesso.
Faça o download do pacote Hadoop no site da Apache Software Fundation para sua máquina local.
Quando o download terminar, copie o pacote para: /var/lib/docker/volumes/datasets/_data
em sua máquina local, e inicie a instalação do Hadoop.
Resumindo:
A instalação do Hadoop, consiste em descompactar, e copiar o arquivo baixado para o diretório /opt, ajustar as permissões, nomenclaturas e inserir as variáveis de ambiente no arquivo .bashrc do usuário hadoop. Conforme sequência de instruções abaixo:
$ sudo cp hadoop-3.2.2.tar.gz /var/lib/docker/volumes/datasets/_data
$ docker attach bb2b1c7c82fb
$ cd /opt
$ id (caso não esteja logado como hadoop, digite su haddop)
$ sudo tar xvf hadoop-3.2.2.tar.gz
$ sudo mv hadoop-3.2.2 hadoop
$ sudo chown hadoop:hadoop hadoop -R
$ sudo chmod 775 hadoop -R
$ mkdir /home/hadoop/Downloads
$ sudo mv hadoop-3.2.2.tar.gz /home/hadoop/Downloads
$ clear
$ ls -lia
Agora ajustaremos as variáveis de ambiente no arquivo .bashrc, seguindo as instruções abaixo:
$ cd
$ nano .bashrc
# Apache Hadoop
export HADOOP_HOME=/opt/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
$ source .bashrc
As variáveis de ambiente foram configuradas. Execute a instrução abaixo:
$ hadoop version
Feito! toda a configuração foi realizada com sucesso.
Configuraremos o Hadoop no Modo Pseudo-Distribuído (Pseudo-Distributed).
Edite os arquivos de configuração, que estão no diretório /opt/hadoop/etc/hadoop
e insira respectivamente os parâmetros abaixo:
- core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
- hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
O processo de instalação e configuração do Apache Hadoop foi concluído.
Execute as seguintes instruções:
- Formate o sistema de arquivos:
$ hdfs namenode -format
O sistema de arquivos foi formatado com sucesso!
- Inicializando o HDFS. Para inicializar o HDFS, execute a instrução abaixo:
$ start-dfs.sh
Ocorreu um erro! este problema ocorre porque precisamos inicializar o serviço SSH.
- Para inicializar o SSH no container digite:
$ sudo /usr/sbin/sshd
- Iniciaremos novamente o HDFS.
$ start-dfs.sh
Pronto, o serviço HDFS foi inicializado!
$ jps (Esta é uma instrução, que permite visualizar todos os serviços do Hadoop em execução.)
Os serviços estão rodando.
Para você acessar o Namenode via browser, e ver detalhes do ambiente.
Abra o seu navegador favorito, digite o IP do container e a porta.
$ http://172.17.0.3:9870/
Recomendo, navegar e explorar as opções.
Comandos adicionais:
$ hdfs dfs -ls /
$ hdfs dfs -mkdir /user
$ hdfs dfs -mkdir /user/hadoop
$ hdfs dfs -put /opt/hadoop/etc/hadoop/*xml /user/hadoop
$ hdfs dfs -ls /user/hadoop
$ stop-dfs.sh
Pronto! ambiente funcionando perfeitamente.
O YARN é um gerenciador de recursos para Apache Hadoop.
O YARN roda sobre o HDFS e permite diferentes mecanismos de processamento de dados. O Apache YARN é considerado o sistema operacional de dados do Hadoop.
Para habilitar o YARN edite os arquivos de configuração, mapred-site.xml e yarn-site.xml, que estão no diretório /opt/hadoop/etc/hadoop, e insira respectivamente os parâmetros abaixo:
- mapred-site.xml:
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
Grave a configuração.
- yarn-site.xml:
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
Grave a configuração.
Execute as seguintes instruções:
$ start-yarn.sh
Os serviços foram inicializados.
$ jps
Os serviços HDFS e YARN estão rodando.
Para acessar o ResourceManager via browser e ler os detalhes do ambiente, abra o seu browser favorito, informe o seu IP, conforme instrução abaixo:
$ http://172.17.0.3:8088/
Recomendo, navegar e explore as opções. E, antes de sair, encerre os serviços.
$ stop-yarn.sh (YARN)
$ stop-dfs.sh (HDFS)
$ docker container stop <ID do Container> (Container Docker que está rodando o Hadoop)
Pronto!
Chegou o final da jornada, para a instalação e configuração do Apache Hadoop em um container Docker.
Espero ter contribuido com o seu desenvolvimento de alguma forma.
- Curso de Formação Cientista de Dados da Data Science Academy
- Docker Hub
- Livro: Descomplicando o Docker 2a edição
Jeferson Fernando Noronha Vitalino
Marcus André Nunes Castro - The Hadoop Ecosystem Table
- Gerando e usando chaves SSH para autenticação de host remoto
- Configurar acesso Cluster Pseudo-Distribuído
- Volumes Dockers
- Apache Hadoop
- Apache Hadoop YARN