Apache Flink 流处理¶
为什么要学 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 语义。
常见问题¶
Q: Flink vs Spark Streaming?¶
- Flink:真正的流处理,低延迟,适合实时场景
- Spark Streaming:微批处理,生态更广,批流一体
Q: PyFlink 成熟吗?¶
功能覆盖约 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