Flink 学习 | 青训营笔记
1 Flink 概念
1.1 Flink 是什么
Apache Flink is a frameworkand and distributed processing engine for stateful computations over unbounded and bounded data streams.
在 Flink 的世界观中,一切都是流组成的。一个无边界的数据流可以按时间切段成一个个有边界的数据集,所以有节数据集(批式数据)也是一种数据流。
1.2 批量计算 vs 流式计算
流式计算,是对数据流进行处理,是实时计算。批量计算则是先统一收集数据,存储到数据库中,然后对数据进行批量处理的数据计算方式。
流式计算的特点:实时计算、快速、低延迟、无限流、动态、无边界。
1.3 三种流式计算引擎对比
| Storm | Spark Streaming | Flink | |
|---|---|---|---|
| Stream Model | Native | mini-batch | Native |
| 一致性保证 | At Least/Most Once | Exactly-Once | Exactly-Once |
| 延迟 | 低(毫秒) | 高(秒) | 低(毫秒) |
| 吞吐 | 低 | 高 | 高 |
| Stateful | No | Yes | Yes |
| SQL | No | Yes | Yes |
2 Flink 架构
2.1 Flink 分层架构
底层:状态存储层,负责存储算子的状态信息。
中间层:Runtime 层,提供了统一的DAG,用来描述数据处理的 Pipeline。不管是流还是批,都会转化为 DAG 图。Scheduler 再把 DAG 转化成分布式环境下的 Task,Task 之间通过 Shuffle 传输数据。
顶层:SDK 层,SQL/Table, DataStream, pyFlink。
2.2 Flink 运行组件
- 作业管理器(JobManager)
每个应用程序都会被一个不同的 JobManager 所控制执行。JobManager 会把 JobGraph 转换成物理层面的 ExecutionGraph。JobManager 会向 ResourceManager 请求执行任务必要的资源,也就是 TaskManager 上的 slot。一旦它获取到了足够的资源,就会将 ExecutionGraph 分发到真正运行它们的TaskManager上。
- 任务管理器(TaskManager)
Flink 中的工作进程。每一个TaskManager 都包含了一定数量 slots 。slots 的数量限制了 TaskManager 能够执行的任务数量。启动之后,TaskManager 会向 ResourceManager 注册它的 slots ;收到 ResourceManager 的指令后,TaskManager 就会将一个或者多个 slots 提供给 JobManager 调用。JobManager就可以向 slots 分配 tasks 来执行。
- 资源管理器(ResourceManager)
ResourceManager 主要负责管理 TaskManager 的 slots(Flink 中定义的处理资源单元)。当 JobManager 申请 slots 资源时,ResourceManager 会将有空闲 slots 的TaskManager 分配给 JobManager。如果 ResourceManager 没有足够的 slots 来满足JobManager的请求,它还可以向资源提供平台发起会话,以提供启动 TaskManager 进程的容器。
- 分发器(Dispatcher)
当一个应用被提交执行时,分发器就会启动并将应用移交给一个 JobManager。注意,Dispatcher 在架构中不是必需的。
2.3 任务提交流程
- 客户端向分发器提交应用;
- 分发器启动并向作业管理器提交应用;
- 作业管理器向资源管理器请求 slots;
- 资源管理器启动任务管理器;
- 任务管理器向资源管理器注册 slots;
- 资源管理器发出提供 slots 的指令;
- 任务管理器向作业管理器提供 slots;
- 作业管理器向任务管理器提交要在 slots 中执行的任务。
2.4 任务调度原理图
3 Exactly Once 语义在 Flink 中的实现
3.1 一致性语义保证
-
At-most-once:每条数据消费至多一次,处理延迟低。
-
At-least-once:每条数据消费至少一次,一条数据可能存在重复消费。
-
Exactly-once:每条数据都被消费且仅被消费一次,仿佛故障从未发生。
3.2 Checkpoint
在流式计算中,会存在有状态的计算逻辑(算子)。比如,需要计算某个用户在网上的点击量,该用户在网站当前的总点击次数就是算子状态,对于新的输入数据,先判断是否是该用户的点击行为,如果是,则将保留的点击次数(状态)增加一,并将当前累加结果输出。
- Checkpoint barrier 的下发
- 算子状态制作和 barrier 传递
- 多个上游的等待 barrier 对齐现象
- Checkpoint 并不阻塞算子数据处
- Checkpoint ACK 和制作完成
(有待研究......)
3.3 端到端 Exactly-Once 实现
- 协作者(JobManager)发起提交(Pre-commit);
- 各算子 Checkpoint 的制作;
- 提交阶段及 Checkpoint 的制作完成。