Flink 是什么
Flink 是流批一体的分布式计算引擎,核心概念是事件时间与状态:数据按自身携带的时间戳参与计算,算子状态可持久化并在故障后恢复,因此能实现至少一次乃至精确一次的处理语义。在实时数仓里它主要承担三件事:CDC 数据入湖、实时 ETL、实时指标计算,也能用同一套 API 跑有界数据的批处理。
基本信息
| 定位 | 流批一体的有状态计算引擎 |
|---|---|
| 核心概念 | 事件时间、水位线、状态、检查点 |
| 典型场景 | 实时数仓、CDC 入湖、实时告警 |
| 部署方式 | YARN / Kubernetes / Standalone |
| 处理语义 | 依靠检查点实现精确一次 |
典型使用场景
- 业务库变更经 CDC 推到消息队列,Flink 实时写入 Iceberg、Hudi 等湖表
- 实时大屏指标:从消息队列消费埋点,按分钟窗口聚合后写入分析库
- 实时规则与告警:支付超时、库存阈值等场景边算边触发
- 实时宽表加工:多路流按主键关联,供下游即席查询
- 历史回补:同一份逻辑用批模式重跑,避免维护两套代码
提交实时作业
提交实时作业
flink run -d -p 8 \
-c com.demo.TradeOrderJob \
/opt/jobs/trade-order-job.jar \
--kafka.bootstrap broker:9092 \
--checkpoint.interval 60000
# -d 后台提交,-p 指定并行度(建议与 Kafka 分区数对齐)
# 提交后用 flink list 与 Flink UI 确认作业处于 RUNNING检查点配置
检查点配置
# flink-conf.yaml 中的常见检查点配置
execution.checkpointing.interval: 60s # 检查点间隔
execution.checkpointing.mode: EXACTLY_ONCE # 精确一次语义
state.backend: rocksdb # 大状态作业建议用 RocksDB
state.checkpoints.dir: hdfs://nn/flink/checkpoints # 状态快照存放位置关键概念对照
| 概念 | 说明 | 常见配置 |
|---|---|---|
| 事件时间 | 用数据自带时间戳计算,结果可重放 | 要求源数据带可靠的时间字段 |
| 水位线 | 用时间阈值界定乱序边界,决定窗口何时触发 | 乱序严重的场景适当放宽 |
| 状态 | 算子记忆的中间数据,如去重键、窗口累加值 | 大状态使用 RocksDB 状态后端 |
| 检查点 | 周期性快照状态,用于故障恢复 | 间隔与存储写入压力需要权衡 |
并行度与消息队列分区数对齐可避免消费瓶颈:并行度小于分区数时,单个子任务要消费多个分区,处理能力被单点限制;并行度远大于分区数又会浪费资源。
Flink SQL 适合快速搭实时链路,复杂逻辑或精细的状态控制仍要用 DataStream API。生产上常见组合是 SQL 做主力加工,个别算子用 API 实现后统一提交。