这是我参与「第四届青训营 」笔记创作活动的第2天
Flink分层架构
- SDK 层:Flink's APIs Overview;
- 执行引擎层(Runtime 层):执行引擎层提供了统一的 DAG,用来描述数据处理的 Pipeline,不管是流还是批,都会转化为 DAG 图,调度层再把 DAG 转化成分布式环境下的 Task,Task 之间通过 Shuffle 传输数据;
- 调度:Jobs and Scheduling;
- Task 生命周期:Task Lifecycle;
- Flink Failover 机制:Task Failure Recovery;
- Flink 反压概念及监控:Monitoring Back Pressure;
- Flink HA 机制:Flink HA Overview;
- 状态存储层:负责存储算子的状态信息
Flink整体架构
JobManager(JM)负责整个任务的协调工作,包括:调度 task、触发协调 Task 做 Checkpoint、协调容错恢复等,核心有下面三个组件:
- Dispatcher: 接收作业,拉起 JobManager 来执行作业,并在 JobMaster 挂掉之后恢复作业;
- JobMaster: 管理一个 job 的整个生命周期,会向 ResourceManager 申请 slot,并将 task 调度到对应 TM 上;
- ResourceManager:负责 slot 资源的管理和调度,Task manager 拉起之后会向 RM 注册;
- TaskManager(TM):负责执行一个 DataFlow Graph 的各个 task 以及 data streams 的 buffer 和数据交换。
--
Shuffle:在分布式计算中,用来连接上下游数据交互的过程叫做Shuffle\
Apache Flink 主要从以下几个模块来做流批一体:
SQL 层;
- DataStream API 层统一,批和流都可以使用 DataStream API 来开发;
- Scheduler 层架构统一,支持流批场景;
- Failover Recovery 层 架构统一,支持流批场景;
- Shuffle Service 层架构统一,流批场景选择不同的 Shuffle Service;
流批一体的 Scheduler 层
Scheduler 主要负责将作业的 DAG 转化为在分布式环境中可以执行的 Task;
1.12 之前的 Flink 版本,Flink 支持两种调度模式:
- EAGER(Streaming 场景):申请一个作业所需要的全部资源,然后同时调度这个作业的全部 Task,所有的 Task 之间采取 Pipeline 的方式进行通信;
- LAZY(Batch 场景):先调度上游,等待上游产生数据或结束后再调度下游,类似 Spark 的 Stage 执行模式。
- Pipeline Region Scheduler 机制:FLIP-119 Pipelined Region Scheduling - Apache Flink - Apache Software Foundation;
[]流批一体的 Shuffle Service 层(FLIP-31: Pluggable Shuffle Service - Apache Flink - Apache Software Foundation)
Shuffle:在分布式计算中,用来连接上下游数据交互的过程叫做 Shuffle。实际上,分布式计算中所有涉及到上下游衔接的过程,都可以理解为 Shuffle;
Shuffle 分类:
- 基于文件的 Pull Based Shuffle,比如 Spark 或 MR,它的特点是具有较高的容错性,适合较大规模的批处理作业,由于是基于文件的,它的容错性和稳定性会更好一些;
- 基于 Pipeline 的 Push Based Shuffle,比如 Flink、Storm、Presto 等,它的特点是低延迟和高性能,但是因为 shuffle 数据没有存储下来,如果是 batch 任务的话,就需要进行重跑恢复;
流和批 Shuffle 之间的差异:
- Shuffle 数据的生命周期:流作业的 Shuffle 数据与 Task 是绑定的,而批作业的 Shuffle 数据与 Task 是解耦的;
- Shuffle 数据存储介质:流作业的生命周期比较短、而且流作业为了实时性,Shuffle 通常存储在内存中,批作业因为数据量比较大以及容错的需求,一般会存储在磁盘里;
- Shuffle 的部署方式:流作业 Shuffle 服务和计算节点部署在一起,可以减少网络开销,从而减少 latency,而批作业则不同。
- Pluggable Shuffle Service:Flink 的目标是提供一套统一的 Shuffle 架构,既可以满足不同 Shuffle 在策略上的定制,同时还能避免在共性需求上进行重复开发
####Flink 流批一体总结
经过相应的改造和优化之后,Flink 在架构设计上,针对 DataStream 层、调度层、Shuffle Service 层,均完成了对流和批的支持。
业务已经可以非常方便地使用 Flink 解决流和批场景的问题了。