Flink 运行时的组建
- 作业管理器: JobManager
- 任务管理器: TaskManager
- 资源管理器:ResourceManager
- 分发器:Dispacher
作业管理器(JobManager)
- 控制一个应用程序执行的主进程,也就是说,每个应用程序都会被不同的JobManager所控制
- jobManager 会先接受到要执行的应用程序,这个应用程序会包括:作业图(JobGraph),逻辑数据图(logical dataflow graph)和打包了所有的类库和其他资源的JAR包。
- JobManager 会向资源管理器请求执行任务必要的资源,也就是任务管理器上的插槽(slot),一旦他获得足够的资源,就会将执行图分发到真正运行他们的TaskManager上,而运行过程中,jobManager会负责所需要的中央协调的操纵,比如说检查点(checkpoints)协调。
任务管理器 (TaskManager)
- Flink 的工作进程。通常在Flink中会有多个TaskManager 运行,每个TaskManager会包含一定数量的插槽(slots).插槽的数量限制了TaskManager能够执行的数量。
- 启动后,TaskManager会向资源管理器注册他的插槽,收到资源管理的指令后,TaskManager 就会将一个或者多个插槽提供给JobManager调用,JobManager就可以向插槽分配任务(tasks)来执行了。
- 在执行中,一个taskManager 可以跟其他运行同一个应用程序的TaskManager 交换数据。
资源管理(ResourceManager)
- 主要负责管理 ,任务管理器的插槽(slot),TaskManager插槽是Flink中定义的处理资源单元。
- Flink 为不同的环境和资源管理工具提供了不同的资源管理器,比如 YARN,K8s,以及 Standalone部署。
分发起(Dispatcher)
- 可以跨作业运行,他为应用提供了REST接口,
- 当一个应用被提交执行的时候,他就会启动并将应用移交给一个JobManager.
- 他会启动一个 Web UI,方便展示信息
任务提交流程
任务提交流程 (Yarn)
任务提交原理
并行度
一个特定算子的子任务的个数被称为其并行度。一般情况下,
一个stream的并行度,可认为就是其所有算子中最大的并行度
TaskManager 和 Slots
- Flink 中每个TaskManager 都是JVM进程,
它可能会在独立的线程上执行一个或多个子任务 - 为了控制一个TaskManager 能接受多少个Task,TaskManager通过
task slot 来进行控制(一个TaskManager 至少有一个slot)
设置 slot 共享组
.slotSharingGroup("red")
结果: 默认的共享组是"default",设置不同的共享组后,整个计算任务会 ,比之前会占多个slot
例如:
flink 子任务的分配
flink 的执行步骤图
数据传输形式
一个程序中,不同的算子可能具有不同的并行度
算子之间的传输数据的形式可以是 one-to-one (forwarding)的模式
也可以是 redistributing的模式,具体是哪一种形式,取决于算子的种类
one-to-one :
stream维护着分区以及元素的顺序(比如source 和map),着意味着map
算子的子任务生产的元素的个数以及顺序跟source算子的子任务生产的元素的个数 ,顺序相同。
map,fliter,flatMap 等算子都是 one-to-one的对应关系
redistributing:
stream的分区会发生改变。,每个算子的子任务依据所选择的transformation
发送数据到不同的目标任务。例如,keyBy基于hashCode 重分区,而broadcast 和 rebalance
会随机重新分区。这些算子都会引起redistribute过程,而redistribute过程
就类似于spark中的shuffle过程。