Apache NiFi

Open Source Mature Visual Streaming

Sistema de automação de fluxo de dados com interface visual para roteamento e transformação

O que é Apache NiFi?

Apache NiFi é uma plataforma de automação de fluxo de dados que suporta roteamento, transformação e mediação de sistemas poderosos e escaláveis. NiFi foi originalmente desenvolvido pela NSA e posteriormente doado para a Apache Software Foundation, oferecendo uma interface web visual para projetar, controlar e monitorar fluxos de dados.

O sistema é baseado no conceito de Flow-Based Programming (FBP), onde dados fluem através de uma rede de componentes conectados. NiFi facilita a movimentação de dados entre sistemas díspares, oferecendo recursos robustos de segurança, monitoramento e governança.

História

Desenvolvido originalmente pela NSA como "Niagara Files" em 2006, o projeto foi open-sourced em 2014 e doado para a Apache Software Foundation. Tornou-se um projeto Apache de nível superior em 2015, sendo amplamente adotado por organizações que precisam de integração de dados robusta e governança.

Arquitetura

A arquitetura do NiFi é baseada em componentes fundamentais:

  • FlowFile: Objeto que representa dados em movimento
  • Processor: Componente que executa trabalho específico
  • Connection: Liga processors e atua como queue
  • Process Group: Agrupa componentes relacionados
  • Controller Services: Serviços compartilhados
  • Reporting Tasks: Tarefas de monitoramento

Vantagens

  • Interface visual intuitiva para design de fluxos
  • Garantias de entrega e rastreabilidade completa
  • Configuração dinâmica sem necessidade de restart
  • Backpressure handling automático
  • Segurança robusta com autenticação e autorização
  • Extensibilidade através de custom processors
  • Clustering para alta disponibilidade
  • Monitoramento e alertas em tempo real

Desvantagens

  • Curva de aprendizado para conceitos específicos
  • Consumo significativo de recursos (CPU, memória)
  • Não é ideal para processamento de streams complexo
  • Performance pode ser limitada para casos de alta throughput
  • Interface web pode ser lenta com fluxos muito grandes
  • Debugging pode ser desafiador em fluxos complexos

Principais Recursos

🎨 Visual Design

Interface drag-and-drop para criação de fluxos de dados

🔄 Data Provenance

Rastreabilidade completa de dados através do fluxo

⚡ Real-time Configuration

Modificação de fluxos sem interrupção do serviço

🔒 Security

Autenticação, autorização e criptografia integradas

📊 Monitoring

Métricas em tempo real e alertas configuráveis

🔧 Extensibility

Custom processors e controller services

Especificações Técnicas

Versão Atual 1.24.0
Linguagem Principal Java
Protocolos Suportados HTTP, FTP, SFTP, JMS, Kafka, HDFS
Formatos de Dados JSON, XML, CSV, Avro, Parquet
Clustering Suporte nativo
Processors Inclusos 300+ processors

Casos de Uso

🔄 Data Integration

Integração de dados entre sistemas heterogêneos com transformações e validações.

📊 ETL Pipelines

Construção de pipelines ETL visuais com monitoramento e governança.

🌊 Stream Processing

Processamento de dados em tempo real com roteamento baseado em conteúdo.

📁 File Movement

Movimentação automatizada de arquivos entre sistemas com validação.

🔍 Data Enrichment

Enriquecimento de dados com informações de múltiplas fontes.

Quando Usar Apache NiFi

✅ Recomendado para:
  • Integração de dados entre sistemas diversos
  • Casos onde governança e auditoria são críticas
  • Equipes que preferem interfaces visuais
  • Necessidade de configuração dinâmica
  • Processamento de dados com transformações complexas
  • Ambientes onde segurança é prioritária
⚠️ Considere alternativas se:
  • Precisa de throughput extremamente alto
  • Casos de uso simples de mensageria
  • Recursos de infraestrutura são limitados
  • Equipe prefere soluções baseadas em código
  • Processamento de streams complexo é necessário
  • Latência ultra-baixa é requisito

Exemplos Práticos

Instalação

# Download e instalação
wget https://downloads.apache.org/nifi/1.24.0/nifi-1.24.0-bin.tar.gz
tar -xzf nifi-1.24.0-bin.tar.gz
cd nifi-1.24.0

# Configurar Java (se necessário)
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk

# Iniciar NiFi
./bin/nifi.sh start

# Verificar status
./bin/nifi.sh status

# Acessar interface web
# http://localhost:8080/nifi

Configuração Básica (nifi.properties)

# Web properties
nifi.web.http.host=localhost
nifi.web.http.port=8080
nifi.web.https.port=8443

# Cluster properties
nifi.cluster.is.node=false
nifi.cluster.node.address=localhost
nifi.cluster.node.protocol.port=11443

# Security properties
nifi.security.keystore=
nifi.security.keystoreType=
nifi.security.keystore.passwd=
nifi.security.truststore=
nifi.security.truststoreType=
nifi.security.truststore.passwd=

# Repository properties
nifi.flowfile.repository.directory=./flowfile_repository
nifi.content.repository.directory.default=./content_repository
nifi.provenance.repository.directory.default=./provenance_repository

# Performance tuning
nifi.flowcontroller.graceful.shutdown.period=10 sec
nifi.flowservice.writedelay.interval=500 ms
nifi.administrative.yield.duration=30 sec

Exemplo de Fluxo: File to Kafka

Fluxo Visual no NiFi:

1. GetFile Processor
   - Directory: /input
   - File Filter: *.json
   - Keep Source File: false

2. EvaluateJsonPath Processor
   - Destination: flowfile-attribute
   - user_id: $.user_id
   - event_type: $.event_type

3. RouteOnAttribute Processor
   - Route based on event_type
   - login_events: ${event_type:equals('login')}
   - purchase_events: ${event_type:equals('purchase')}

4. PublishKafka_2_6 Processor
   - Kafka Brokers: localhost:9092
   - Topic Name: user-events
   - Message Key Field: user_id

Custom Processor (Java)

@Tags({"custom", "transform", "example"})
@CapabilityDescription("Custom processor example")
public class CustomTransformProcessor extends AbstractProcessor {
    
    public static final PropertyDescriptor TRANSFORM_TYPE = new PropertyDescriptor.Builder()
        .name("Transform Type")
        .description("Type of transformation to apply")
        .required(true)
        .allowableValues("uppercase", "lowercase", "reverse")
        .defaultValue("uppercase")
        .build();
    
    public static final Relationship REL_SUCCESS = new Relationship.Builder()
        .name("success")
        .description("Successfully transformed FlowFiles")
        .build();
    
    public static final Relationship REL_FAILURE = new Relationship.Builder()
        .name("failure")
        .description("Failed to transform FlowFiles")
        .build();
    
    @Override
    protected List getSupportedPropertyDescriptors() {
        return Arrays.asList(TRANSFORM_TYPE);
    }
    
    @Override
    public Set getRelationships() {
        return new HashSet<>(Arrays.asList(REL_SUCCESS, REL_FAILURE));
    }
    
    @Override
    public void onTrigger(ProcessContext context, ProcessSession session) {
        FlowFile flowFile = session.get();
        if (flowFile == null) {
            return;
        }
        
        try {
            String transformType = context.getProperty(TRANSFORM_TYPE).getValue();
            
            flowFile = session.write(flowFile, (inputStream, outputStream) -> {
                String content = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
                String transformed;
                
                switch (transformType) {
                    case "uppercase":
                        transformed = content.toUpperCase();
                        break;
                    case "lowercase":
                        transformed = content.toLowerCase();
                        break;
                    case "reverse":
                        transformed = new StringBuilder(content).reverse().toString();
                        break;
                    default:
                        transformed = content;
                }
                
                outputStream.write(transformed.getBytes(StandardCharsets.UTF_8));
            });
            
            session.transfer(flowFile, REL_SUCCESS);
            
        } catch (Exception e) {
            getLogger().error("Failed to transform FlowFile", e);
            session.transfer(flowFile, REL_FAILURE);
        }
    }
}

Docker Compose Setup

version: '3.8'
services:
  nifi:
    image: apache/nifi:1.24.0
    container_name: nifi
    ports:
      - "8080:8080"
      - "8443:8443"
    environment:
      - NIFI_WEB_HTTP_PORT=8080
      - NIFI_CLUSTER_IS_NODE=true
      - NIFI_CLUSTER_NODE_PROTOCOL_PORT=8082
      - NIFI_ZK_CONNECT_STRING=zookeeper:2181
      - NIFI_ELECTION_MAX_WAIT=30 sec
      - NIFI_SENSITIVE_PROPS_KEY=changemeplease
    volumes:
      - nifi_database_repository:/opt/nifi/nifi-current/database_repository
      - nifi_flowfile_repository:/opt/nifi/nifi-current/flowfile_repository
      - nifi_content_repository:/opt/nifi/nifi-current/content_repository
      - nifi_provenance_repository:/opt/nifi/nifi-current/provenance_repository
      - nifi_state:/opt/nifi/nifi-current/state
      - nifi_logs:/opt/nifi/nifi-current/logs
      - ./input:/input
      - ./output:/output
    networks:
      - nifi_network

  zookeeper:
    image: zookeeper:3.7
    container_name: zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181
    networks:
      - nifi_network

volumes:
  nifi_database_repository:
  nifi_flowfile_repository:
  nifi_content_repository:
  nifi_provenance_repository:
  nifi_state:
  nifi_logs:

networks:
  nifi_network:
    driver: bridge

Comparações

NiFi vs Alternativas

Aspecto Apache NiFi StreamSets Apache Kafka
Interface Visual drag-and-drop Visual drag-and-drop Código/CLI
Governança Excelente Boa Limitada
Throughput Moderado Alto Muito Alto
Latência Moderada Baixa Muito Baixa
Facilidade de Uso Alta Alta Baixa
Licença Apache 2.0 Proprietária Apache 2.0

Matriz de Decisão

🎯 Escolha NiFi se:
  • Precisa de interface visual intuitiva
  • Governança e auditoria são críticas
  • Integração de sistemas diversos
  • Configuração dinâmica é importante
  • Equipe prefere ferramentas visuais
  • Segurança robusta é necessária
🔄 Considere alternativas se:
  • Precisa de throughput extremamente alto
  • Latência ultra-baixa é crítica
  • Recursos de infraestrutura limitados
  • Casos de uso simples de mensageria
  • Equipe prefere soluções baseadas em código
  • Processamento de streams complexo
📊 Quick Facts
Versão Atual: 1.24.0
Licença: Apache 2.0
Linguagem: Java
Primeira Release: 2014
Última Atualização: Janeiro 2024
🔄 Tecnologias Relacionadas
💼 Conteúdo Patrocinado