本篇希望对flink的架构有一个概念上的认识,角色之间是如何交互的。
文章目录
一. 整体架构模型
flink运行时有两种类型的进程组成:一个JobManager和若干个TaskManager,也是典型的主从架构。
高可用(HA)设置中可能有多个 JobManager,其中一个始终是 leader,其他的则是 standby。
角色 | 职责 |
---|---|
Jobmanager | 管理集群的计算资源、job的管理与调度执行、checkpoint的协调 |
taskmanager | 提供计算资源供job运行 |
Client | 解析job为JobGraph对象,然后提交到Jobmanager运行,并监控Job运行的状态 |
一个job被提交到集群的过程
客户将flink jar提交到client端,client将job解析为JobGraph实例,然后将jar和JobGraph一起通过RPC提交到jobmanager,提交成功后Jobmanager返回JobClient给client,用于job的通讯,可以用来获取job的状态。jobmanager将job拆分成不同的task并提交到TaskManagr开始作业的运行。
二. 架构成员
1. Jobmanager
jobmanager进程有三个组件组成
组件 | 作用 |
---|---|
ResourceManager | 1. 资源管理:管理task slots。slots资源调度的单位 2. Flink 为不同的环境和资源提供者(例如 YARN、Mesos、Kubernetes 和 standalone)实现了对应的 ResourceManager 3. standalone模式中,ResourceManager 只能分配可用 TaskManager 的 slots,不能启动新的。 |
Dispatcher | 1. 提供了一个 REST 接口,用来提交 Flink 应用程序执行,并为每个作业启动一个新的JobMaster。 2. 运行 Flink WebUI 用来提供作业执行信息。 |
JobMaster | 管理单个JobGraph的执行。 |
Jobmanager的作用:
- 将jobGraph转换成Execution Graph:jobGraph只是描述了逻辑图,Execution Graph会将Graph拆分成不同的执行单元(task),提交到taskmanager不同的slot上。
- 网络通讯:jobmanager、client、taskmanager之间通过Akka(rpc通讯)实现通讯。其中Akka的核心组件Actor System实现了远端通讯。
- job的接收与分发
- TaskManager的注册:当taskmanager启动时,它会通过akka向jobmanager进行注册,将自己的信息交给Jobmanager让它维护。而且和taskmanager之间进行heartbeat操作。
2. TaskManager
作用 | 描述 |
---|---|
作业执行 | 一个taskmanager中对应多个slot,对于JVM进程,一个slot其实就是一个线程,slot集其实就是线程池。 |
Shuffle Environment管理 | 当有一些算子执行需要shuffle时,需要Data Exchange。 |
Memory Management内存管理 | 当task在执行时,会有数据到来,这需要申请一些内存单元,管理这些数据,例如序列化反序列化。 |
Rpc通讯 | 通过Akka的核心实现Actor System,进行网路通讯。 |
Network Management网络数据交换 | 通过netty实现taskmanager之间进行数据交互(上下游或shuffle) |
接受Jobmanager的资源申请 | jobmanager资源的申请,taskmanager返回申请的结果给jobmanager。 |
3.Client
client用于生成执行环境,进入用户的main方法生成jobGraph对象,然后提交任务,将jobGraph和作业所依赖的包提交到jobmanager的dispacher。
三. 什么是JobGraph
1. 用户程序转换为JobGraph
通过DataStream、DataSet API、Flink SQl、Table API等方式可以实现Flink job jar,执行flink run将job提交到Flink。
client接收到jar后,执行器通过反射找到指定类的main方法并执行,执行有本地执行,远程执行,或在yarn上执行。
调用execute将程序转换为steamGraph,接着转换成JobGraph,然后提交到Dispatcher中。
2. jobGraph
用户的程序不管是通过那种方式实现,Executor都会将抽象为streamGraph,streamGraph只是Dataflow的一个表达,没有描述具体执行时算子并发的操作。
JobGraph进一步描述了具体执行时算子的并发、算子之间的交互关系。同样通过DAG的方式表达了(不同Flink接口实现的)用户程序。JobGraph描述了job的详情,是客户端与集群之间的job载体。
参考:
https://time.geekbang.org/course/detail/100058801-278258