Como criar um sanbox com Docker e começar sua viagem do NiFi ao Hadoop

Photo by FORREST CAVALE on Unsplash

Achou que a gente ia ficar só na teoria? Achou errado ot@$%#!

Tá começando mais um post do dataengineerbr, um blog de Engenharia de Dados.

E o tema hoje é… TRANSPORTE DE DADOS. Vamos falar do NiFi, ele que não é motorista de van, mas nasceu prô transporte.

Solta a vinheta Simone!

Como voce deve ter percebido, sou fã do Choque de Cultura, é um dos motivos de eu pagar internet! Homenagem feita, vamos ao que interessa.


Conceituando o Mínimo Necessário

Nosso tutorial vai contar com três componentes, Nifi, Hadoop e Docker. Para entender o papel de cada um, vamos conceituar o básico.

NiFi, nascido para transportar

Visto da lua, o NiFi é uma ferramenta útil para automatizar o fluxo de dados entre sistemas. Se esse fluxo for contínuo então, um caso de streaming, “aí é que ele é útil mesmo”. Para construir seu primeiro fluxo, é importante conhecer ao menos estes dois termos:

  • FlowFile: Todo dado que cai no Nifi é convertido em um ou mais FlowFiles. Um FlowFile é composto pelo content, o conteúdo ou dado propriamente dito, e atributos, pares chave-valor que representam propriedades do conteúdo.
  • Processor: As caixinhas utilizadas para construir o seu fluxo, responsáveis por executar as mais diversas tarefas do tipo: receber, enviar ou processar os FlowFiles.

Hadoop, já falamos

Visto deste post aqui, o Hadoop não é nada complicado. Para o nosso experimento, basta saber que ele será o destino final dos nossos dados, vamos armazenar tudo no HDFS, seu robusto sistema distribuído de arquivos.

Docker, não é uma VM

Visto de outra galáxia, o Docker é uma ferramenta para facilitar a criação, implementação e execução de aplicativos usando containers. Esses caras permitem que um desenvolvedor distribua um aplicativo e suas dependências como um único pacote. Não é uma VM, mas é como se fosse uma VM ultraleve com nada mais do que o necessário para a sua aplicação executar. Vamos utilizá-lo para preparar, em poucos minutos, um sandbox enxuto integrando o Hadoop e o NiFi. Se quiser conhecer o docker mais de perto, vai encontrar bons livros como esse:

Será que roda no meu PC

Executei o tutorial em um notebook Intel Core I3, 8GB de RAM, com Ubuntu 16.04 LTS. As imagens Docker utilizadas para executar os containers ocupam juntas aproximadamente 5GB de espaço em disco. Durante a execução do tutorial, o uso geral de memória não ultrapassou os 4GB.


Mão na Massa

1. Instalando o Docker

Este passo segue a documentação oficial de instalação do Docker CE no ubuntu:

1.1 Atualizando a lista de pacotes

sudo apt-get update

1.2 Instalando os pacotes para usar um repositório via HTTPS

sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common

1.3 Adicionando a chave oficial GPG do Docker

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

1.4 Conferindo se a chave foi adicionada

sudo apt-key fingerprint 0EBFCD88 

A E2D8 8D81 803C 0EBF CD88
uid [ unknown] Docker Release (CE deb) <docker@docker.com>
sub rsa4096 2017–02–22 [S]

1.5 Adicionando o repositório

sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"

1.6 Atualizando novamente o pacote

sudo apt-get update

1.7 Instalando a última versão do Docker

sudo apt-get install docker-ce docker-ce-cli containerd.io

1.8 Validando a instalação

sudo docker run hello-world

Se deu tudo certo, você vai ver algo semelhante em seu terminal:

2. Instalando o Hadoop

Para o Hadoop, vamos utilizar uma imagem enxuta da distribuição Cloudera, disponível no docker hub: chalimartines/cdh5-pseudo-distributed. Essa imagem já contém o HDFS, YARN, MapReduce, Hue, Ozzie e Spark.

2.1 Baixando e instalando a imagem no nosso Docker

sudo docker pull chalimartines/cdh5-pseudo-distributed

Aguarde o download. Aproximadamente 2GB.

2.2 Executando o container, incluindo o mapeamento de portas

sudo docker run --name cdh -d -p 8020:8020 -p 50070:50070 -p 50010:50010 -p 50020:50020 -p 50075:50075 -p 8030:8030 -p 8031:8031 -p 8032:8032 -p 8033:8033 -p 8088:8088 -p 8040:8040 -p 8042:8042 -p 10020:10020 -p 19888:19888 -p 11000:11000 -p 8888:8888 -p 18080:18080 -p 9999:9999 chalimartines/cdh5-pseudo-distributed

2.3 Consultando o IP do container

sudo docker inspect cdh | grep '"IPAddress"' | head -n 1

2.4 Conferindo a instalação

Abra o browser e digite o endereço abaixo. Substitua <IP> pelo endereço IP consultado no item 2.3.

Você pode testar os demais serviços da distribuição nos endereços abaixo:

  • hue: http://<IP>:8888

3. Instalando o NiFi

Para o NiFi, vamos utilizar uma imagem distribuída pela Hortonworks, disponível no docker hub: hortonworks/nifi.

3.1 Baixando e instalando a imagem Docker

sudo docker pull apache/nifi

3.2 Executando o container a partir da imagem

sudo docker run --name nifi -d -p 8080:8080 hortonworks/nifi 

Pode levar alguns minutos até a inicialização completa do serviço, no meu caso foram 2 minutos. O parâmetro “-d” executa a inicialização em background. Para acompanhar o processo, execute o comando sem esse parâmetro.

3.3 Consultando o IP do container

sudo docker inspect nifi | grep '"IPAddress"' | head -n 1

3.4 Conferindo a instalação

Abra o browser e digite o endereço abaixo. Substitua <IP> pelo endereço IP consultado no item 3.3.

Se a página não responder, pode ser que o serviço ainda esteja em inicialização, aguarde mais alguns minutos.

  • NiFi: http://<IP>:8080/nifi

4. Configurando o ambiente Hadoop

Neste passo vamos configurar o ambiente Hadoop para integração com o NiFi.

4.1 Acessando o bash do container Hadoop

sudo docker exec -it -u 0 cdh bash

4.2 Criando o usuário nifi no ambiente

useradd nifi

4.3 Criando o diretório HDFS que receberá os dados

su hdfs
hdfs dfs -mkdir /dados-hadoop

4.4 Configurando as permissões do usuário nifi no diretório do HDFS

hdfs dfs -chown nifi:supergroup /dados-hadoop
hdfs dfs -chmod 755 /dados-hadoop

4.5 Conferindo as permissões

hdfs dfs -ls /

4.6 Saindo do bash do container Hadoop

exit
exit

5. Configurando o ambiente NiFi

Neste passo vamos configurar o ambiente NiFi para integração com o Hadoop.

5.1 Criando um diretório local temporário para edição e transferência dos arquivos de configuração entre os containers Hadoop e NiFi

cd
mkdir temp-conf
cd temp-conf

5.2 Copiando os arquivos de configuração do container Hadoop para o diretório temporário

sudo docker cp cdh:/etc/hadoop/conf/core-site.xml .
sudo docker cp cdh:/etc/hadoop/conf/hdfs-site.xml .

Para editar os arquivos de configuração, você precisará do IP e Hostname do container Hadoop. Você pode consultá-los utilizando os comandos abaixo:

5.3 Consultando o endereço IP do container Hadoop

sudo docker inspect cdh | grep '"IPAddress"' | head -n 1

5.4 Consultado o Hostname do container Hadoop

sudo docker inspect cdh | grep '"Hostname"' | head -n 1

5.5 Abrindo o arquivo core-site.xml para edição

Use o editor de sua preferência.

sudo vi core-site.xml

5.6 Alterando o valor da propriedade fs.default.name

Subtitua <IP> pelo IP do container Hadoop recuperado no item 5.3.

<property>
<name>fs.default.name</name>
<value>hdfs://<IP>:8020</value>
</property>

exemplo do arquivo core-site.xml alterado:

5.7 Copiando os arquivos de configuraçao editados para o container NiFi

sudo docker cp . nifi:/etc/conf

6. Preparando os dados para o NiFi

Neste passo vamos separar o arquivo que será transportado pelo NiFi até o Hadoop.

6.1 Criando um diretório local temporário para o arquivo de dados

cd
mkdir temp-data
cd temp-data

6.2 Escolhendo um arquivo arquivo de dados

Para esse tutorial, o conteúdo do arquivo não é tão importante, você pode escolher um arquivo de sua preferência e copiar para o diretório temp-data. Se preferir, utilize esse arquivo:

https://github.com/carlosrochacardoso/dataengineerbr/blob/master/tutoriais/do-nifi-ao-hadoop/shakespeare.txt

6.3 Copiando o arquivo de dados para o container NiFi

Considerando que você está no diretório temp-data, e que esse diretório possui o arquivo de dados, use o comando abaixo para copiá-lo para o container NiFi

sudo docker cp . nifi:/dados-nifi

7. Criando o fluxo no NiFi

Neste passo vamos criar um fluxo simples responsável por coletar e transporte os dados até o Hadoop, gravando um arquivo no HDFS.

Na imagem abaixo, você tem uma visão geral da interface do NiFi.

Ou ainda este vídeo oficial:

7.1 Acessando a interface do NiFi

Se o NiFi não estiver aberto em seu browser, abra conforme descrito no passo 3.4.

7.2 Adicionando o processor ListFile

Arraste o componente Processor do menu até o centro da tela, busque por ListFile e clique em ADD.

7.3 Configurando o ListFile

Acesse a aba PROPERTIES e configure os parâmetros:

  • Input Directory: /dados-nifi
  • Recurse Subdirectories: false

7.4 Adicionando o processor FetchFile

Arraste o componente Processor do menu até o centro da tela, busque por FetchFile e clique em ADD.

7.5 Configurando o FetchFile

Acesse a aba SETTINGS e configure os parâmetros:

  • Em Automatically Terminate Relationships, marque os itens: failure, not.found, permission.denied

7.6 Adicionando o processor PutHDFS

Arraste o componente Processor do menu até o centro da tela, busque por PutHDFS e clique em ADD.

7.7 Configurando o PutHDFS

Acesse a aba SETTINGS e configure os parâmetros

  • Em Automatically Terminate Relationships, marque os itens: failure, success

Acesse a aba PROPERTIES e configure os parâmetros:

  • Hadoop Configuration Resources: /etc/conf/core-site.xml
  • Directory: /dados-hadoop

7.8 Conectando os processors ListFile e FetchFile

Para conectá-los, clique no processor ListFile e arraste até o FetchFile . Marque o item success.

7.9 Conectando os processor FetchFile e PutHDFS

Para conectá-los, clique no processor FetchFile e arraste até o PutHDFS. Marque o item success.

7.10 Executando o fluxo

  • Clique no processor ListFile e depois em start na caixa Operate.
  • Visualize os atributos do FlowFile
  • Inicie o processor FetchFile
  • Visualize o conteúdo do FlowFile
  • Inicie o processor PutHDFS

Observe que o FlowFile saiu da fila entre o FetchFile e PutHDFS

7.11 Visualizando o arquivo transferido para o Hadoop

Abra o browser e digite o endereço abaixo. Substitua <IP> pelo endereço IP consultado no item 2.3.

name node: http://<IP>:50070

Acesse no menu superior o item Utilities e depois Browse the file system. Navegue pela pasta dados-hadoop.

The End

Se você chegou até aqui, meu muito obrigado e parabéns!

Aproveite sua sandbox para explorar o NiFi e Hadoop. Não fique só nos primeiros passos, dê os segundos e terceiros.

Até a próxima!

Referências

DATA ENGINEER BR

Conhecendo o irmão mais novo e menos sexy do Data Science

Carlos Alberto Rocha Cardoso

Written by

Data professional, enjoying the journey of the life, the universe and everything.

DATA ENGINEER BR

Conhecendo o irmão mais novo e menos sexy do Data Science

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade