Flink运行时架构
架构的整体介绍
Flink 的运行时架构中,最重要的就是两大组件:**作业管理器(JobManger)**和任务管理器
(TaskManager)。对于一个提交执行的作业,JobManager 是真正意义上的“管理者”(Master),
负责管理调度,所以在不考虑高可用的情况下只能有一个;而 TaskManager 是“工作者”
(Worker、Slave),负责执行任务处理数据,所以可以有一个或多个。
还有就是flink的客户端client,Dispatcher
客户端并不是处理系统的一部分,它只负责作业的
提交。具体来说,就是调用程序的 main 方法,将代码转换成“数据流图”(Dataflow Graph),
并最终生成作业图(JobGraph),一并发送给 JobManager。
Dispatcher 主要负责提供一个 REST 接口,用来提交应用,并且负责为每一个新提交的作
业启动一个新的 JobMaster 组件。Dispatcher 也会启动一个 Web UI,用来方便地展示和监控作
业执行的信息。Dispatcher 在架构中并不是必需的,在不同的部署模式下可能会被忽略掉。
JobManger,TaskManager ,客户端,Dispatcher基本是组成flink提交作业的架构。
再来说说flink从提交任务到执行任务生成的四个图
分别为 逻辑流图(StreamGraph), 作业图(JobGraph),执行图(ExecutionGraph),物理图(Physical Graph)
其中StreamGraph和JobGraph是在Client中生成。
ExecutionGraph是在JobManager中生成。
Physical Graph是在TaskManager中生成
逻辑流图(StreamGraph)
这是根据用户通过 DataStream API 编写的代码生成的最初的 DAG 图,用来表示程序的拓
扑结构。这一步一般在客户端完成。
我们可以看到,逻辑流图中的节点,完全对应着代码中的四步算子操作:
源算子 Source(socketTextStream())→扁平映射算子 Flat Map(flatMap()) →分组聚合算子
Keyed Aggregation(keyBy/sum()) →输出算子 Sink(print())。
作业图(JobGraph)
StreamGraph 经过优化后生成的就是作业图(JobGraph),这是提交给 JobManager 的数据
结构,确定了当前作业中所有任务的划分。主要的优化为: 将多个符合条件的节点链接在一起
合并成一个任务节点,形成算子链,这样可以减少数据交换的消耗。JobGraph 一般也是在客
户端生成的,在作业提交时传递给 JobMaster。
在图中,分组聚合算子(Keyed Aggregation)和输出算子 Sink(print)并行度都为 2,
而且是一对一的关系,满足算子链的要求,所以会合并在一起,成为一个任务节点。
执行图(ExecutionGraph)
JobMaster 收到 JobGraph 后,会根据它来生成执行图(ExecutionGraph)。ExecutionGraph
是 JobGraph 的并行化版本,是调度层最核心的数据结构。
从图 中可以看到,与 JobGraph 最大的区别就是按照并行度对并行子任务进行了拆分,
并明确了任务间数据传输的方式。
物理图(Physical Graph)
JobMaster 生成执行图后, 会将它分发给 TaskManager;各个 TaskManager 会根据执行图
部署任务,最终的物理执行过程也会形成一张“图”,一般就叫作物理图(Physical Graph)。
这只是具体执行层面的图,并不是一个具体的数据结构。
图中,物理图主要就是在执行图的基础上,进一步确定数据存放的位置和
收发的具体方式。有了物理图,TaskManager 就可以对传递来的数据进行处理计算了。
所以我们可以看到,程序里定义了四个算子操作:源(Source)->转换(flatMap)->分组
聚合(keyBy/sum)->输出(print);合并算子链进行优化之后,就只有三个任务节点了;再考
虑并行度后,一共有 5 个并行子任务,最终需要 5 个线程来执行。
作业提交流程
(1) 一般情况下,由客户端(App)通过分发器提供的 REST 接口,将作业提交给
JobManager。
(2)由分发器启动 JobMaster,并将作业(包含 JobGraph)提交给 JobMaster。
(3)JobMaster 将 JobGraph 解析为可执行的 ExecutionGraph,得到所需的资源数量,然后
向资源管理器请求资源(slots)。
(4)资源管理器判断当前是否由足够的可用资源;如果没有,启动新的 TaskManager。
(5)TaskManager 启动之后,向 ResourceManager 注册自己的可用任务槽(slots)。
(6)资源管理器通知 TaskManager 为新的作业提供 slots。
52
(7)TaskManager 连接到对应的 JobMaster,提供 slots。
(8)JobMaster 将需要执行的任务分发给 TaskManager。
(9)TaskManager 执行任务,互相之间可以交换数据。
如果部署模式不同,或者集群环境不同(例如 Standalone、YARN、K8S 等),其中一些步
骤可能会不同或被省略,也可能有些组件会运行在同一个 JVM 进程中。
还有 任务(Tasks)和任务槽(Task Slots)。算子链(Operator Chain)。并行度(Parallelism)。提交模式等。以后再更。