🌊

Apache Flink

Open Source Stream Processing Low Latency Processamento

Framework para computações stateful sobre data streams

O que é Apache Flink?

Apache Flink é um framework e engine distribuído para processamento stateful sobre streams de dados unbounded e bounded. Flink foi projetado para rodar em todos os ambientes de cluster comuns, realizar computações em velocidade in-memory e em qualquer escala. Ele fornece processamento de stream de baixa latência e alta throughput, bem como suporte para event-time processing e exactly-once state consistency.

História

Flink começou como um projeto de pesquisa chamado "Stratosphere" na Universidade Técnica de Berlim em 2010. Foi doado para a Apache Software Foundation em 2014 e se tornou um projeto top-level em 2014. O projeto foi desenvolvido com foco específico em stream processing, diferentemente de outros frameworks que adicionaram streaming como uma extensão.

Arquitetura

Flink utiliza uma arquitetura master-worker com JobManager (coordenador) e TaskManagers (workers). O runtime é baseado em dataflow graphs onde operadores são conectados por streams. Flink mantém estado distribuído usando checkpoints para fault tolerance e oferece diferentes deployment modes incluindo standalone, YARN, Mesos e Kubernetes.

Vantagens

  • Baixa Latência: Processamento sub-segundo com pipeline contínuo
  • Event-time Processing: Suporte nativo para event-time e watermarks
  • Exactly-once Guarantees: Consistência de estado garantida
  • Backpressure: Controle automático de fluxo
  • Stateful Processing: Gerenciamento avançado de estado distribuído
  • Flexibilidade: Suporte a batch e stream com mesma API

Desvantagens

  • Complexidade: Curva de aprendizado mais íngreme
  • Ecossistema: Menor que Spark em termos de integrações
  • Recursos: Requer mais recursos para pequenos workloads
  • Debugging: Troubleshooting pode ser desafiador
  • Comunidade: Menor base de usuários comparado ao Spark

Principais Recursos

⚡ Stream Processing

Processamento de streams em tempo real com baixa latência e alta throughput.

🕐 Event-time Processing

Processamento baseado no tempo do evento com suporte a watermarks.

✅ Exactly-once Semantics

Garantias de processamento exactly-once com checkpointing distribuído.

🔄 Stateful Processing

Gerenciamento avançado de estado com diferentes backends de estado.

📊 Complex Event Processing

CEP library para detecção de padrões complexos em streams.

🔧 Flexible Deployment

Suporte a múltiplos cluster managers e deployment modes.

Especificações Técnicas

Versão Atual 1.18.0
Linguagens Java, Scala, Python (PyFlink), SQL
Deployment Standalone, YARN, Mesos, Kubernetes
State Backends Memory, FsStateBackend, RocksDBStateBackend
Connectors Kafka, Kinesis, Pulsar, Elasticsearch, JDBC
Requisitos Java 8+, 1GB+ RAM

Casos de Uso

🚨 Real-time Fraud Detection

Detecção de fraudes em tempo real analisando padrões de transações com baixa latência. Ideal para sistemas financeiros que precisam bloquear transações suspeitas instantaneamente.

📊 Real-time Analytics

Dashboards em tempo real com métricas atualizadas continuamente. Perfeito para monitoramento de KPIs, alertas operacionais e business intelligence em tempo real.

🔄 Event-driven Applications

Aplicações que reagem a eventos em tempo real, como sistemas de recomendação, personalizações dinâmicas e automação de processos.

📈 Complex Event Processing

Detecção de padrões complexos em streams de eventos, como análise de comportamento de usuários, monitoramento de IoT e detecção de anomalias.

🌐 Data Pipeline Modernization

Migração de pipelines batch para streaming para reduzir latência e melhorar responsividade do sistema.

Quando Usar Apache Flink

✅ Recomendado para:
  • Aplicações que requerem baixa latência (sub-segundo)
  • Processamento de eventos com timestamps complexos
  • Sistemas que precisam de exactly-once guarantees
  • Complex Event Processing (CEP)
  • Aplicações stateful com estado complexo
  • Processamento de streams com backpressure
  • Event-time processing com watermarks
⚠️ Considere alternativas se:
  • Você precisa principalmente de batch processing (use Spark)
  • Workloads são simples e não requerem baixa latência
  • Você precisa de um ecossistema mais maduro
  • Recursos são limitados para pequenos projetos
  • Equipe não tem experiência com stream processing

Exemplos Práticos

Instalação

# Download e instalação
wget https://archive.apache.org/dist/flink/flink-1.18.0/flink-1.18.0-bin-scala_2.12.tgz
tar -xzf flink-1.18.0-bin-scala_2.12.tgz
cd flink-1.18.0

# Iniciar cluster local
./bin/start-cluster.sh

# Verificar Web UI
# http://localhost:8081

# Parar cluster
./bin/stop-cluster.sh

Exemplo Java - Word Count Streaming

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;

public class WordCountStreaming {
    public static void main(String[] args) throws Exception {
        // Criar execution environment
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        
        // Ler dados do socket
        DataStream text = env.socketTextStream("localhost", 9999);
        
        // Processar dados
        DataStream> wordCounts = text
            .flatMap(new Tokenizer())
            .keyBy(value -> value.f0)
            .timeWindow(Time.seconds(5))
            .sum(1);
        
        // Output
        wordCounts.print();
        
        // Executar
        env.execute("Word Count Streaming");
    }
    
    public static class Tokenizer implements FlatMapFunction> {
        @Override
        public void flatMap(String value, Collector> out) {
            String[] words = value.toLowerCase().split("\\W+");
            for (String word : words) {
                if (word.length() > 0) {
                    out.collect(new Tuple2<>(word, 1));
                }
            }
        }
    }
}

Exemplo Python (PyFlink)

from pyflink.datastream import StreamExecutionEnvironment
from pyflink.table import StreamTableEnvironment
from pyflink.table.descriptors import Schema, Kafka, Json

def main():
    # Criar environments
    env = StreamExecutionEnvironment.get_execution_environment()
    t_env = StreamTableEnvironment.create(env)
    
    # Configurar Kafka source
    t_env.connect(Kafka()
                  .version("universal")
                  .topic("input-topic")
                  .start_from_earliest()
                  .property("bootstrap.servers", "localhost:9092")) \
        .with_format(Json()
                     .derive_schema()) \
        .with_schema(Schema()
                     .field("user_id", "STRING")
                     .field("event_type", "STRING")
                     .field("timestamp", "TIMESTAMP(3)")
                     .field("value", "DOUBLE")) \
        .create_temporary_table("source_table")
    
    # Processar dados
    result = t_env.sql_query("""
        SELECT 
            user_id,
            event_type,
            COUNT(*) as event_count,
            AVG(value) as avg_value,
            TUMBLE_START(timestamp, INTERVAL '1' MINUTE) as window_start
        FROM source_table
        GROUP BY 
            user_id, 
            event_type,
            TUMBLE(timestamp, INTERVAL '1' MINUTE)
    """)
    
    # Output para console
    result.execute_insert("print").wait()

if __name__ == '__main__':
    main()

Complex Event Processing (CEP)

import org.apache.flink.cep.CEP;
import org.apache.flink.cep.PatternStream;
import org.apache.flink.cep.pattern.Pattern;
import org.apache.flink.cep.pattern.conditions.SimpleCondition;
import org.apache.flink.streaming.api.datastream.DataStream;

// Definir padrão para detecção de fraude
Pattern fraudPattern = Pattern.begin("first")
    .where(new SimpleCondition() {
        @Override
        public boolean filter(Transaction transaction) {
            return transaction.getAmount() > 1000;
        }
    })
    .next("second")
    .where(new SimpleCondition() {
        @Override
        public boolean filter(Transaction transaction) {
            return transaction.getAmount() > 1000;
        }
    })
    .within(Time.minutes(5));

// Aplicar padrão ao stream
PatternStream patternStream = CEP.pattern(
    transactionStream.keyBy(Transaction::getUserId),
    fraudPattern
);

// Processar matches
DataStream alerts = patternStream.select(
    (Map> pattern) -> {
        List first = pattern.get("first");
        List second = pattern.get("second");
        return new Alert("Possible fraud detected", 
                        first.get(0).getUserId());
    }
);

Tutoriais Relacionados

Comparações

Flink vs Spark Streaming

Apache Flink
  • True streaming (record-by-record)
  • Menor latência (sub-segundo)
  • Event-time processing nativo
  • Exactly-once guarantees
  • Backpressure automático
Spark Streaming
  • Micro-batch processing
  • Maior latência (segundos)
  • Melhor para batch + streaming
  • Ecossistema mais maduro
  • APIs mais simples

Comparação de Performance

Métrica Flink Spark Streaming Storm
Latência Sub-segundo Segundos Sub-segundo
Throughput Alto Muito Alto Médio
Fault Tolerance Exactly-once At-least-once At-least-once
State Management Avançado Básico Limitado
📊 Quick Facts
Versão Atual: 1.18.0
Licença: Apache 2.0
Linguagem: Java, Scala
Primeira Release: 2014
Última Atualização: Dezembro 2024
🔄 Tecnologias Relacionadas
💼 Conteúdo Patrocinado

Espaço disponível para parceiros

Anuncie Aqui