个人总结的关于flink运行架构
1.基本组成:
客户端,ResourceManager,Dispatcher,Jobmaster,Taskmanager,slot
ResourceManager:负责管理Taskmanager(分配和释放)和slot
Dispatcher:负责对新提交任务的调度和分发(在架构中可能不是必须的)
Jobmaster:管理单个JobGraph,每一个job都有Jobmaster
Taskmanager:向resourcemanager注册它的slot,并供给jobmanager调用(又叫worker)
slot:任务执行的最小单位,它是一组资源的集合,一个TaskManager至少有一个slot,**当它空闲的时候不同的job可以共享它**
2.关联介绍
1.并行度Parallelism:一个特定算子的subtask的个数称之为这个算子的并行度Parallelism,一般情况下可以任务一个流的并行度就是其所有算子中并行度最大的那个算子的并行度,**如果slot的个数小于并行度的话,那么程序会一致卡死在create状态,等待足够的资源的时候才会运行**
2.Parallelis优先级:算子指定>env全局指定>提交参数>配置文件
3.task和subtask:不同算子的子任务经过一定的优化串在一起就行程了subtask,但是对于taskmanager来讲还是一个task
4.operator chains任务链:one-to-one和redistributing
- 前者以为着子任务产生的元素个数,顺序相同顺序,例如map,fliter,flatmap等
- 后者是指经过重分区算子类于spark的shuffle过程,任务链类似于spark的血缘关系,
flink会将这样关联起来的one-to-one算子链接起来形成一个task,每一个task被一个线程执行.
- 将算子链接成task是非常有效的优化,因为它能减少线程之间的切换和基于缓存区的数据交换,在减少延时的同时提高吞吐量,但是同样也会加大某个slot的压力,可以通过以下方法进行断开任务链,同时它也能避免数据跨节点传输
*算子.startNewChain() => 与前面断开
* 算子.disableChaining() => 与前后都断开
* env.disableOperatorChaining() => 全局都不串
5.共享组(它也能避免数据跨节点传输):默认情况下所有算子都是同一个共享组,任务所需要的slot的数量是最大算子的并行度,但是当使用共享组的时候,任务所需要的slot的数量就是**每个共享组中最大并行度的和**
6.ExecutionGraph:分为四层 StreamGraph -> JobGraph -> ExecutionGraph -> Physical Graph