Framework para computações stateful sobre data streams
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.
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.
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.
Processamento de streams em tempo real com baixa latência e alta throughput.
Processamento baseado no tempo do evento com suporte a watermarks.
Garantias de processamento exactly-once com checkpointing distribuído.
Gerenciamento avançado de estado com diferentes backends de estado.
CEP library para detecção de padrões complexos em streams.
Suporte a múltiplos cluster managers e deployment modes.
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 |
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.
Dashboards em tempo real com métricas atualizadas continuamente. Perfeito para monitoramento de KPIs, alertas operacionais e business intelligence em tempo real.
Aplicações que reagem a eventos em tempo real, como sistemas de recomendação, personalizações dinâmicas e automação de processos.
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.
Migração de pipelines batch para streaming para reduzir latência e melhorar responsividade do sistema.
# 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
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));
}
}
}
}
}
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()
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());
}
);
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 |