这是我参与「第四届青训营 」笔记创作活动的第4天。
大项目需要自己实现一个流式计算引擎。在之前的笔记中,已对流计算基础、rpc、thrift 等进行了学习,为项目的实现打下了理论基础。接下来,在课程的基础上学习和梳理了 Flink 原理和架构,为项目设计思路和框架搭建提供了参考。
Flink 简介
Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink 擅长处理实时流数据,同时也可以处理有界的批数据,实现流批一体。
和其他计算引擎对比:Storm、Spark Sreaming、Flink
Flink 的优势主要在于:
- 高吞吐,低延迟
- Exactly Once 一致性保证
- 容错机制完善,checkpoint(快照)
- 流量控制
- 乱序数据支持
- ...
Flink 生态较完善。虽然只是一个计算引擎,但是能与业内重要的其他组件相结合。
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 和数据交换。
作业示例
WordCount:Source—>map—>KeyBY()—>sink
operator(合并成一个线程,chain在一起后,减少了线程之间的切换和反序列化)
将Task 调度到具体的TaskManager 中的Slot 中执行。