Apache NIFI — Introdução aos conceitos
Este artigo tem por objetivo apresentar algumas das principais características do Apache NIFI para aqueles que desejam iniciar em sua utilização, apresentando alguns conceitos norteadores sobre do que é composta a ferramenta e como ela funciona.
O que é
O Apache NiFi é uma ferramenta desenvolvida pela Apache Software Foundation que permite realizar a automação de fluxos de dados entre sistemas em tempo real através de uma interface WEB.
Em suma, sua lógica consiste em dois pontos principais:
- Configurar processors: seja para capturar/escrever dados, bem como realizar conversões e outras manipulações de dados;
- Interligar estes processors por conexões: puxando setas entre os processors para desenhar o fluxo de dados.
Arquitetura
O NiFi é executado dentro da JVM, e possui algumas características de importante conhecimento quando se pensa em criar fluxos de dados mais otimizados. Entre eles, temos:
WEB SERVER
Além da interface gráfica disponibilizada para realizar a manipulação dos processors e criação dos fluxos, também é disponibilizada uma API baseada em HTTP por onde é possível gerenciar os fluxos de dados e extrair algumas estatísticas gerais.
FLOW CONTROLLER
Este é o grande cérebro por trás do NiFi.
É ele quem constantemente gerencia os fluxos existentes, liberando as threads necessárias para processamento… identificando quando é a hora de iniciar processos agendados… segurando os flowfiles em filas enquanto todos os recursos estão ocupados, entre diversas outras operações gerenciadas por seu framework.
REPOSITORIES
Para que o NiFi tenha controle sobre todas as operações em trânsito em seus fluxos, existem três principais repositórios que guardam todas as informações essenciais.
- FlowFile Repository, responsável por armazenar todas as informações de controle pertinentes aos flowfiles existentes e ativos no fluxo, como por exemplo seu estado atual;
- Content Repository, responsável por armazenar os bytes com o conteúdo dos flowfiles existentes e ativos no fluxo;
- Provenance Repository, responsável por armazenar o histórico de eventos gerados pelos processors e flowfiles (origem dos eventos, tipos, destinos, entre outros).
“The Core Concepts of NiFi”
Quando se inicia com a criação de fluxos dentro do NiFi, é importante conhecer bem os principais conceitos que norteiam seu desenvolvimento e que são essenciais para entender como a ferramenta trabalha. Dentre eles, temos:
Processors
Os processors no NiFi são caixinhas “especialistas” em realizar uma determinada tarefa.
Há processors que existem apenas para fazer requisições HTTP, outros, apenas para transformar JSONs. Há ainda aqueles que se conectam a um banco de dados e realizam alguma operação, entre diversas outras opções (o NiFi disponibiliza centenas destes processors que na maioria dos casos atendem à todas as necessidades de um fluxo).
Para entender melhor o que são estes “especialistas”, podemos fazer alusão a uma linha de produção:
1. Imagine que há uma esteira passando com um produto que precisa ser trabalhado em várias etapas até chegar em seu estado final — este é o fluxo de dados;
2. Cada uma destas etapas é um operário responsável por realizar uma única operação acerca do produto, e enviar o seu resultado para a etapa seguinte (cada um destes operários é um processor do fluxo de dados);
3. Após a última etapa realizada, o produto finalmente estará pronto — dando fim ao fluxo de dados praquele produto.
Connections
As conexões são as peças que interligam diferentes processors e dão sentido ao fluxo de dados.
Também conhecidos como “Relationships”, são eles que indicam para onde os flowfiles serão redirecionados. Após o término do processamento do processor origem (à esquerda da relação) o flowfile é enviado ao processor destino (à direita da relação).
Dependendo do resultado obtido é possível enviar o resultado para um caminho alternativo no seu fluxo de dados. Em casos de sucesso no processamento, você pode configurar para o relationship “success” seguir determinado fluxo lógico e, em casos de falha, criar outro fluxo lógico para o relationship de “failure”, por exemplo.
Você pode, ainda, tomar dois caminhos distintos para um mesmo relationship, bastando apenas puxar duas conexões de “success” de uma mesma origem, mas que sigam para destinos diferentes cada um (bifurcando o fluxo).
Queues
As filas são automaticamente criadas para cada relação entre dois processors. Elas são responsáveis por armazenar flowfiles já processados pelo processor origem, e encaminhá-los para o processor destino um a um conforme a desocupação do mesmo.
Cada fila permite a configuração de um backpressure, que age como um limitador da quantidade de flowfiles que podem ficar parados simultaneamente na mesma fila.
Há basicamente dois modos de se configurar o backpressure:
- Object Thresholder, indica a quantidade máxima de flowfiles que a fila suporta simultaneamente.
- Data Size Thresholder, indica o tamanho máximo (em bytes) que a fila suporta simultaneamente.
Quando uma das duas opções de backpressure acima atinge seu limite, o NIFI automaticamente para de alimentar esta fila com novos flowfiles, até que haja espaço vago novamente.
FlowFiles
Um flowfile é a unidade de trabalho que o NIFI transita entre os processors de um fluxo de dados, e é composto por duas partes:
- Attributes, são as características do flowfile que fornecem informações/contexto sobre seus dados. É um conjunto de par/valor que é transmitido adiante independemente de qualquer alteração que o flowfile sofra.
- Content, é o conteúdo representado pelo flowfile. Quando um flowfile sofre alguma alteração em seu conteúdo, o mesmo é substituído pelos novos dados e o anterior é sobrescrito, transmitindo adiante apenas o conteúdo atual.
Para fins didáticos, é possível fazer uma alusão entre a composição de um flowfile e uma requisição HTTP, onde os attributes seriam os headers e o content seria o payload/request body.