跳转至

Apache Flink 流处理

Apache Flink 是领先的开源流处理框架,支持有状态的实时数据流计算。它提供了精确一次(exactly-once)语义、事件时间处理和复杂事件处理能力。对于实时数据管道、实时分析、事件驱动应用等场景,Flink 是比 Spark Streaming 更专业的选择。


核心概念

概念白话解释用途
DataStream数据流无界数据的处理抽象
Window窗口将流数据分组计算
State状态流处理中的持久化数据
Checkpoint检查点容错恢复机制
Watermark水印处理事件时间乱序
Flink SQL流式 SQL用 SQL 处理流数据

安装配置

# 下载 Flink
wget https://downloads.apache.org/flink/flink-1.18.0/flink-1.18.0-bin-scala_2.12.tgz
tar xzf flink-*.tgz && cd flink-*

# 启动本地集群
./bin/start-cluster.sh
# 访问 http://localhost:8081

# PyFlink
pip install apache-flink

快速上手

from pyflink.table import EnvironmentSettings, TableEnvironment

env_settings = EnvironmentSettings.in_streaming_mode()
t_env = TableEnvironment.create(env_settings)

# Flink SQL
t_env.execute_sql('''
    CREATE TABLE source (
        user_id STRING,
        amount DECIMAL(10,2),
        ts TIMESTAMP(3),
        WATERMARK FOR ts AS ts - INTERVAL '5' SECOND
    ) WITH (
        'connector' = 'kafka',
        'topic' = 'transactions',
        'properties.bootstrap.servers' = 'localhost:9092',
        'format' = 'json'
    )
''')

t_env.execute_sql('''
    SELECT user_id, SUM(amount) as total,
           TUMBLE_START(ts, INTERVAL '1' MINUTE) as window_start
    FROM source
    GROUP BY user_id, TUMBLE(ts, INTERVAL '1' MINUTE)
''').print()

进阶用法

窗口操作

  • 滚动窗口(Tumbling):固定大小不重叠
  • 滑动窗口(Sliding):固定大小可重叠
  • 会话窗口(Session):按活动间隔分组

状态管理

Flink 自动管理状态和检查点,支持 RocksDB 状态后端处理超大状态。

与 Kafka 集成

Flink 是 Kafka 的最佳流处理伴侣,提供端到端的 exactly-once 语义。


常见问题

  • Flink:真正的流处理,低延迟,适合实时场景
  • Spark Streaming:微批处理,生态更广,批流一体

功能覆盖约 Java API 的 80-90%,持续改进中。生产环境建议关注版本兼容性。


参考资源

  • 官网:https://flink.apache.org/
  • PyFlink 文档:https://nightlies.apache.org/flink/flink-docs-stable/docs/dev/python/overview/
  • GitHub:https://github.com/apache/flink