1. Flink名词介绍
- Dataflow:Flink程序在执行时会被Flink系统映射成数据流模型,这个数据流模型就叫Dataflow.
备注:Flink就是通过数据流模型对Operator进行优化。 - Operator:数据流模型中的每个操作被称作Operator,Operator分为Source Operator、Transformation Operator、Sink Operator。
- Partition:数据流模型是分布式和并行的,执行过程中会形成1—n个分区。
- Subtask:多个分区任务可以并行的,每个都是运行在一个线程中,也就是Subtask子任务。
- Parallelism:并行度,就是可以同时真正执行的子任务数/分区数。
2.Operator传递模式
数据在两个Operator(算子)之间传递的时候有两种模式:
- One to One 模式:一对一模式,分区内的数据是一一对应的,也就是没有shuffle的
- Redistributing模式:重分布模式,分区内的数据会重新分布,也就是有shuffle的
2. Operator Chain
客户端在提交任务的时候会根据Dataflow对Operator进行优化操作,能进行合并的Operator会被合并为一个OperatorChain(执行链),每个OperatorChain会在TaskManager上一个独立的线程中,也就是SubTask.
*备注: *只有OneToOne的才可以合并。
3.TaskSlot And Slot Sharing
- TaskSlot任务槽
- TaskSlot任务槽就是运行任务的线程槽,有多少个TaskSlot就表示该TaskManager可以同时运行多少个SubTask / 线程。
- TaskSlot数量是用来限制一个TaskManager工作进程中可以同时运行多少个SubTask / 线程,TaskSlot是一个TaskManager中的最小资源分配单位,一个TaskManager中有多少TaskSlot就意味着能支持多少并发Task处理。
- Flink将进程的内存进行划分到多个TaskSlot中,内存被划分到不同的TaskSlot之后可以有如下好处:
- TaskManager最多能同时并发的子任务数是可以通过TaskSlot 数量来控制的。
- TaskSlot有独占的内存空间,这样在一个TaskManager中可以运行多个不同的作业,作业之间不受影响
备注: 这其实也就是在进程中增加线程概念的优点。
- Slot Sharing任务槽共享
- Slot Sharing任务槽共享就表示线程执行完之后,任务槽不会被立即销毁或者回收,而是可以继续给下一个SubTask使用。
- Flink允许子任务共享插槽,即使他们是不同阶段的SubTask,只要他们是来自同一个作业。比如下图中的map 和keyBy和sink在一个TaskSlot里执行以达到资源共享的目的。
- 允许插槽共享有两个主要好处:
- 资源分配更加公平,如果有比较空闲的Slot可以将更多的任务分配给它
- 有了任务槽共享,可以提高资源的利用率。
备注
- slot是静态的概念,是指TaskManager具有的并发执行的能力。
- parallelism是动态的概念,是指程序运行时实际使用的并发能力。
4.Flink执行流程
-
StreamGraph:最初的程序执行逻辑流程,也就是算子之间的前后顺序–在Client上生成
-
JobGraph:将OneToOne的Operator合并为OperatorChain–在Client上生成
-
ExecutionGraph:将JobGraph根据代码中设置的并行度和请求的资源进行并行化规划!–在JobManager上生成
-
物理执行图:将ExecutionGraph的并行计划,落实到具体的TaskManager上,将具体的SubTask落实到具体的TaskSlot内进行运行。