Análise de Tweets com Nifi, Kafka, Postgres e Metabase no Google Cloud (Parte 1/3)

Savio Teles
Data Hackers
Published in
7 min readJan 29, 2021

O objetivo deste artigo é criar um pipeline de ingestão de dados reais do Twitter utilizando Apache Nifi e Apache Kafka. O pipeline obtém os tweets da API do Twitter e armazena no PostgreSQL para serem visualizados com o Metabase. Iremos utilizar máquinas da cloud do Google, mas o tutorial funciona em qualquer servidor ou provedor da nuvem, inclusive na sua máquina (caso tenha memória RAM suficiente). Todo o ambiente foi conteinerizado com Docker.

O pipeline completo e todos os arquivos de configuração estão disponíveis no meu github no seguinte link. Depois de instalar e configurar o ambiente, basta importar o arquivo de pipeline (no seguinte link) dentro do Apache Nifi.

Segue uma descrição sucinta das ferramentas e plataformas que iremos utilizar neste tutorial:

  • Apache Kafka: uma plataforma distribuída open-source de stream de dados utilizada por mais de 80% das empresas na lista Fortune 100 para construção de pipelines de dados de alta performance, streaming analytics e integração de dados. Para o cenário do Twitter é uma ferramenta muito utilizada, já que consegue processar os tweets em tempo real. Por exemplo, se você deseja saber o que estão falando sobre a sua empresa ou organização em tempo real é a ferramenta perfeita.
  • Apache Nifi: uma ferramenta open source para automatizar e gerenciar o fluxo de dados entre diversas origens com diversos tipos de destinos, tais como Hadoop (HDFS), Kafka, Spark, dentre outros. Neste tutorial, esta ferramenta irá permitir automatizar todo o fluxo de ingestão, transformação e carregamento dos tweets no destino final (PostgreSQL).
  • Apache Zookeeper: ambos, Kafka e Nifi, utilizam o Zookeeper como sistema que permite a coordenação distribuída dos serviços, provendo alta confiabilidade.
  • PostgreSQL: banco de dados relacional, open source, com alta confiabilidade, robustez e performance.
  • Metabase: solução open source de business intelligence, que facilita a criação e compartilhamento de análise dos dados da sua empresa.
  • Google Cloud: fornece serviços de computação em nuvem.

Este artigo está dividido em três partes para facilitar a compreensão do pipeline de dados. A primeira parte apresenta as ferramentas que serão utilizadas e como fazer o deploy delas no Google Cloud. A segunda parte consiste em descrever o pipeline completo, desde a coleta de dados do Twitter até a escrita no PostgreSQL. A última etapa consiste em descrever os passos para criar painéis no BI Metabase com o intuito de gerar análises sobre os dados do Twitter.

Arquitetura da Solução

A arquitetura da solução está apresentada na figura abaixo. Os dados do Twitter são coletados por um job do Nifi e enviados, no formato JSON, para um tópico do Kafka. Os dados dos tweets armazenados pelo Kafka são lidos e preparados por outro pipeline do Nifi, que deixa os dados prontos para serem armazenados no PostgreSQL. Estes dados do PostgreSQL são lidos pelo Metabase para gerar os relatórios de análise dos dados do Twitter.

Você pode construir o pipeline sem o Apache Kafka também. A importância de publicar o tweet bruto (formato JSON) no Kafka é que podemos ter vários outros pipelines de dados, rodando de forma paralela, consumindo estas informações para outros fins. Você teria neste caso um produtor publicando os tweets no tópico e vários consumidores utilizando estes dados. Por exemplo, um dos consumidores poderia obter os tweets, armazenar no S3 da Amazon e realizar análise de sentimento dos clientes em relação a sua empresa, utilizando as ferramentas da AWS. Outro consumidor poderia utilizar os tweets para identificar, em tempo real, locais em que estão ocorrendo desastres e poder notificar as autoridades competentes.

Arquitetura da Solução

Pré-requisitos

  • Possuir uma conta no Google Cloud. O Google possui um modelo free trial que, atualmente (janeiro de 2021), fornece 300 dólares para você utilizar.
  • Possuir uma conta de desenvolvedor no Twitter com as chaves e token da conta (account keys e token). Você pode ver detalhes de como obter a chave e o token no twitter developers site. O artigo neste link pode auxiliar na criação da conta de desenvolvedor no Twitter.

Criação e configuração da máquina no Google Cloud

O deploy do ambiente será realizado em uma máquina no Google Cloud. Você pode seguir o tutorial do Google Cloud para criar uma nova máquina. Neste tutorial foi utilizado o sistema operacional CentOS 7 para instalar todas as ferramentas. Caso você queira criar um ambiente de testes, a dica é utilizar as VMs preemptivas do Google Cloud que são bem mais baratas que o normal (mais de 3 vezes, geralmente), mas com algumas limitações, como serem interrompidas se estiverem em execução há mais de 24 horas.

É desejável que você crie IPs estáticos para a sua máquina (tutorial aqui de como criar) com endereço IP externo fixo que não muda para que o IP nunca mude e facilite seus testes posteriores.

Será necessário que você configure o firewall do Google cloud para liberar o acesso HTTP às portas 8080, 19000 e 3001, que serão utilizadas para acesso às ferramentas. A imagem abaixo mostra um exemplo desta regra configurada no Google Cloud. Se você tiver dúvidas em como acessar esta tela, você pode acessar a documentação oficial no seguinte link.

Instalação do Docker

O Docker deve ser instalado no sistema operacional para que todas as ferramentas possam serem executadas com containers. Os comandos abaixo visam instalar o Docker no CentOS 7, mas caso seu sistema operacional seja diferente, você pode seguir o tutorial oficial do Docker.

$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io
$ sudo systemctl enable docker
$ sudo systemctl start docker
$ sudo usermod -aG docker $USER

Você deve ‘deslogar’ da conta e entrar novamente para que seu usuário tenha permissão de executar comandos do Docker. Também é necessário instalar o docker-compose para levantar o ambiente de forma mais fácil. O comando abaixo mostra como instalar o docker-compose no Linux, mas caso você tenha algum problema na instalação ou outro sistema operacional, você pode seguir o tutorial oficial.

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.28.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

Instalação e configuração do Kafka e Nifi

Ambos, Kafka e Nifi, utilizam a ferramenta Apache Zookeeper como sistema que permite a coordenação distribuída dos serviços, provendo alta confiabilidade.

No código abaixo é apresentado o arquivo ‘docker-compose-kafka-nifi.yml’ descrevendo os serviços que serão levantados utilizando containers Docker. Todos os serviços levantados estão na mesma rede (twitter-net), além de configurados no modo Bridge, para conseguirem se comunicar.

Para iniciar o ambiente, basta baixar o arquivo ‘docker-compose-kafka-nifi.yml’ e executar o comando docker-compose:

$ curl https://gist.githubusercontent.com/savioteles/639933777929166d4fca1c5ea686fe68/raw/5da4c4ca1c631ed2dbe8d0cf3c8637ffa98f743b/docker-compose-kafka-nifi.yml -o docker-compose-kafka-nifi.yml
$ sudo docker-compose -f docker-compose-kafka-nifi.yml up -d

O primeiro serviço descrito é o Zookeeper, que escuta requisições na porta 2181, por padrão, e está configurado com a variável de ambiente ‘ALLOW_ANONYMOUS_LOGIN=yes’ para aceitar conexões de usuários não autenticados.

O segundo serviço é o Kafka, que escuta requisições na porta 9092, por padrão. Como o Kafka utiliza o Zookeeper, foi adicionado o ‘depends_on’ para indicar esta dependência. Algumas variáveis de ambiente foram configuradas neste serviço, destacando aqui a variável ‘KAFKA_ZOOKEEPER_CONNECT’ que indica o endereço de conexão com o zookeeper, neste caso zookeeper:2181, pois o Zookeeper está escutando requisições no hostname zookeeper e porta 2181.

Para facilitar o gerenciamento dos tópicos do Kafka, adicionamos também o serviço Kafdrop. Ele escuta requisições na porta padrão 9000, mas adicionamos um roteamento para o host da porta 19000 para porta 9000, ou seja, temos que acessar o Kafdrop no browser pela porta 19000.

O último serviço aqui descrito é o Nifi, que foi configurado com algumas variáveis de ambiente, destacando aqui a ‘NIFI_ZK_CONNECT_STRING’ que indica o endereço do Zookeeper (neste caso ‘zookeeper:2181’). O acesso HTTP ao Nifi é realizado na porta 8080.

Instalação e configuração do PostgreSQL e Metabase

Os dados, lidos e “tratados” do Twitter, são armazenados no PostgreSQL e depois gerados relatórios no BI Metabase utilizando estes dados. O Metabase suporta vários outros bancos de dados (lista aqui), mas escolhemos o Postgres neste tutorial por questão de simplicidade.

No código abaixo é apresentado o arquivo ‘docker-compose-metabase-postgres.yml’ descrevendo como o Postgres e o Metabase serão levantados utilizando containers Docker. Todos os serviços levantados estão na mesma rede (twitter-net), além de configurados no modo Bridge, para conseguirem se comunicar.

Para iniciar o ambiente, basta baixar o arquivo ‘docker-compose-metabase-postgres.yml’ e, dentro da pasta do arquivo, digitar o comando abaixo:

$ curl https://gist.githubusercontent.com/savioteles/32b2290746acef8955d9398b0b6c6731/raw/b1325f83ec835dba23fa216f8c56ba8cb20b43bb/docker-compose-metabase-postgres.yml -o docker-compose-metabase-postgres.yml
$ sudo docker-compose -f docker-compose-metabase-postgres.yml up -d

O PostgreSQL escuta requisições na porta 5432 e os dados serão armazenados na máquina física em ‘/postgres’. Nas variáveis de ambiente foram configurados o usuário ‘metabase’ e senha ‘postgres’ para o banco de dados com nome ‘metabase’ no PostgreSQL.

O Metabase, por sua vez, escuta requisições na porta 3000, mas neste container ele está escutando na porta 3001 no host e roteando para a porta 3000 do container. Ou seja, você deve acessar o Metabase no browser na porta 3001. Nas variáveis de ambiente são informados todos os dados de acesso ao PostgreSQL, já que o Metabase também irá utilizar o PostgreSQL para armazenar seus metadados.

Próximos Passos

Chegou ao final a primeira etapa da construção do pipeline de dados do Twitter. Neste primeiro passo instalamos e configuramos o Kafka, Nifi, PostgreSQL e Metabase no ambiente de nuvem do Google Cloud. Na próxima etapa iremos construir o pipeline de dados do Twitter dentro do Nifi integrando com o Kafka.

Os arquivos do Docker Compose, deste artigo, você pode encontrar no meu github.

Você pode acessar a segunda parte do artigo no seguinte link.

Referências

--

--

Savio Teles
Data Hackers

Doutor em Ciência da Computação. Pesquisador e desenvolvedor na área de Big Data & Machine Learning há mais de 12 anos.