1、在此之前,我先说一下flink主要组件:
JobManager,作业管理器,它的作用主要有3点:
2、Flink Yarn-per-job模式提交流程:
flink任务提交后,yarn客户端开始执行代码、生成逻辑数据流图、作业图以及其他一些配置信息,并根据YarnResourceManager返回的资源路径上传Flink的Jar包和配置,之后向YarnResourceManager提交任务,YarnResourceManager分配Container资源并通知对应的NodeManager启动AppMaster,AppMaster启动后加载Flink的Jar包和配置构建环境,然后分别启动flink组件JobManager、Dispacher、ResourceManager,在这过程中,flink组件JobManager将作业图转为执行图ExecutionGraph,并通过AppMaster向YarnResourceManager申请资源,请求slot插槽来执行任务,YarnResourceManager收到请求后分配新Container资源,并让由AppMaster通知资源所在节点的NodeManager启动flink组件TaskManager,然后TaskManager向flink组件ResourceManager所在的节点注册solt,flink组件ResourceManager所在的节点发出提供solt的指令给TaskManager,TaskManager则把自己的solt提供给JobManager,最后JobManager提交任务给对应TaskManager的slot执行。
3、作业调度原理
slot和并行度、任务调度关系
我先说一下什么是solt? 什么是并行度?
slot:是在TaskManager里面负责处理资源的单元,一个TaskManager至少有一个以上的slot
并行度:一个算子设置多少个子任务的个数就称为并行度
TaskManager是一个jvm进程,slot是一个独立的线程,任务分配给TaskManager后在插槽slot中执行,有多少任务由并行度决定,能完成多少任务,由slot决定,两个概念
slot的多少,决定当前TaskManager最大执行的线程数量,表示并行执行所能提供的最大能力,可以在flink配置文件中进行配置,是静态概念
并行度在算子中设置为多少,则决定真正执行的时候那个并行任务多少,表示并行执行所需要的实际能力,是动态,可以调节的
所以一个流中并行度的大小,直接决定需要多少个插槽slot,那么一个流中有几个并行度,怎么看?
如果一个流中,没有在全局设置断链、也没有为算子中设置共享组、也没有为算子设置断链、也没有为算子设置开启新链,则可以看成完整一条流,则此时需要使用TaskManager几个数量slot,取决于这条流的每个算子所设置并行度中最大的那个算子的并行度,比如map算子设置并行度2,keyby设置为3且是所有算子中设置最大的并行度,则此时这条流需要使用TaskManager三个slot。
如果一个流中,算子中设置共享组,则此时需要使用TaskManager中slot的数量为每个算子设置的并行度的总和。
补充:并行度的优先级
1、如果设置了每个算子的并行度,则并行度以算子设置的并行度为准
2、如果没有设置算子的并行度,则默认使用代码中全局(env)设置的并行度
3、如果全局(env)没有设置并行度,则使用提交Job时配置的并行度
4、最后才使用flink配置文件中的默认并行度
4、程序结构和数据流
5、执行图
6、数据传输和任务链
数据传输形式:
1、One-to-one:分区不变和元素的顺序不变。
2、Redistributing:分区改变。
任务链:并行度相同、并且是 one-to-one 操作
任务链的设置:
1、算子设置断链:disablechaining()
2、算子开启新链:startNewchaining()
3、全局断链:env.disablechaining()
4、通过为算子添加共享组设置断链 slotSharingGroup("组名")