Flink运行架构
Flink 的运行时架构中,最重要的就是两大组件:作业管理器(JobManger)和任务管理器(TaskManager)。对于一个提交执行的作业,JobManager 是真正意义上的“管理者”(Master),负责管理调度,所以在不考虑高可用的情况下只能有一个;而 TaskManager 是“工作者”(Worker、Slave),负责执行任务处理数据,所以可以有一个或多个 作业提交和任务处理时的运行架构
JobManager和TaskManager的启动方式:
作为独立集群的进程,直接在集群上使用
在容器中使用
有资源管理平台调度启动
TaskManager 启动之后,JobManager 会与它建立连接,并将作业图(JobGraph)转换成可执行的“执行图”(ExecutionGraph)分发给可用的 TaskManager,然后就由 TaskManager 具体执行任务
作业管理器(JobManager)
JobManager 是一个 Flink 集群中任务管理和调度的核心,是控制应用执行的主进程。也就是说,每个应用都应该被唯一的 JobManager 所控制执行
JobManager的三大组件:
1)JobMaster:是JobManager中最核心的组件,负责处理单独的作业,JobMaster和具体的job是一一对应的,多个job可以运行在一个flink集群中,每个job都有一个自己的JobMaster
2)Resourcemanager资源管理器:主要负责资源的分配与管理,在flink中主要是指TaskManager的任务槽(flink集群资源调度单元 包含了CPU和内存资源)
3)分发器(Dispatcher):主要负责提供一个rest接口,用来提交作业,并且负责为每一个新提交的作业启动一个新的JobMaster组件
任务管理器(TaskManager)
TaskManager 是 Flink 中的工作进程,负责数据流的具体计算任务(task)。Flink 集群中必须至少有一个 TaskManager;当然由于分布式计算的考虑,通常会有多个 TaskManager 运行,每一个 TaskManager 都包含了一定数量的任务槽(task slots)。Slot 是资源调度的最小单位,slots的数量限制了 TaskManager 能够并行处理的任务数量。
启动之后,TaskManager 会向资源管理器注册它的 slots;收到资源管理器的指令后,TaskManager 就会将一个或者多个槽位提供给 JobMaster 调用,JobMaster 就可以分配任务来执行了。
在执行过程中,TaskManager 可以缓冲数据,还可以跟其他运行同一应用的 TaskManager交换数据
作业提交流程
Flink的提交流程随着部署模式和资源管理平台的不同会有不同的变化
作业提交流程的具体步骤:
(1)一般情况下,由客户端(App)通过分发器提供的REST接口,将作业提交给JobManager
(2)由分发器启动 JobMaster,并将作业(包含 JobGraph)提交给 JobMaster。
(3)JobMaster 将 JobGraph 解析为可执行的 ExecutionGraph,得到所需的资源数量,然后向资源管理器请求任务槽资源(slots)。
(4)资源管理器判断当前是否由足够的可用资源;如果没有,启动新的 TaskManager。
(5)TaskManager 启动之后,向 ResourceManager 注册自己的可用任务槽(slots)。
(6)资源管理器通知 TaskManager 为新的作业提供 slots。
(7)TaskManager 连接到对应的 JobMaster,提供 slots。
(8)JobMaster 将需要执行的任务分发给 TaskManager。
(9)TaskManager 执行任务,互相之间可以交换数据
独立模式下的作业提交流程
在独立模式(Standalone)下,只有会话模式和应用模式两种部署方式。两者整体来看流程是非常相似的:TaskManager 都需要手动启动,所以当 ResourceManager 收到 JobMaster 的请求时,会直接要求 TaskManager 提供资源。而 JobMaster 的启动时间点,会话模式是预先启动,应用模式则是在作业提交时启动
YARN集群环境下作业的提交流程
1)会话模式
在会话模式需要先启动一个YARN-Session会话,这样会创建一个flink集群
这里只启动了 JobManager,而 TaskManager 可以根据需要动态地启动。在 JobManager 内部,由于还没有提交作业,所以只有 ResourceManager 和 Dispatcher 在运行
提交作业的流程
(1)客户端通过 REST 接口,将作业提交给分发器。
(2)分发器启动 JobMaster,并将作业(包含 JobGraph)提交给 JobMaster。
(3)JobMaster 向资源管理器请求资源(slots)。
(4)资源管理器向 YARN 的资源管理器请求 container 资源。
(5)YARN 启动新的 TaskManager 容器。
(6)TaskManager 启动之后,向 Flink 的资源管理器注册自己的可用任务槽。
(7)资源管理器通知 TaskManager 为新的作业提供 slots。
(8)TaskManager 连接到对应的 JobMaster,提供 slots。
(9)JobMaster 将需要执行的任务分发给 TaskManager,执行任务
单作业模式(per-job)
在单作业模式下,Flink 集群不会预先启动,而是在提交作业时,才启动新的 JobManager
(1)客户端将作业提交给 YARN 的资源管理器,这一步中会同时将 Flink 的 Jar 包和配置上传到 HDFS,以便后续启动 Flink 相关组件的容器。
(2)YARN 的资源管理器分配容器(container)资源,启动 Flink JobManager,并将作业提交给 JobMaster。这里省略了 Dispatcher 组件。
(3)JobMaster 向资源管理器请求资源(slots)。
(4)资源管理器向 YARN 的资源管理器请求容器(container)。
(5)YARN 启动新的 TaskManager 容器。
(6)TaskManager 启动之后,向 Flink 的资源管理器注册自己的可用任务槽。
(7)资源管理器通知 TaskManager 为新的作业提供 slots。
(8)TaskManager 连接到对应的 JobMaster,提供 slots。
(9)JobMaster 将需要执行的任务分发给 TaskManager,执行任务
应用模式(application)
应用模式与单作业模式的提交流程非常相似,只是初始提交给 YARN 资源管理器的不再是具体的作业,而是整个应用。一个应用中可能包含了多个作业,这些作业都将在 Flink 集群中启动各自对应的 JobMaster。
名词解释
数据流图
flink的程序由三部分组成:source、transformation、sink
source表示源算子 负责读取数据源
transformation表是转换算子,利用各种算子进行各种加工
sink表示下沉算子 负责数据的输出
flink程序运行时会被映射成所有算子按照逻辑顺序连接在一起的一张图 称为数据流图
并行度
把一个算子操作,“复制”多份到多个节点,数据来了之后就可以到其中任意一个执行。这样一来,一个算子操作就被拆分成了多个并行的“子任务”(subtasks),再将它们分发到不同节点,就真正实现了并行计算
并行度的设置
代码中:setParallelism(2)
提交作业是设置:-p 2
配置文件中:parallelism.default: 2
作业图(JobGrape)、执行图(ExecutionGrape)
flink运行时会将程序映射成数据流图 需要将数据流图进一步解析,转化为物理执行图
数据流图-》作业图-》执行图-》物理图
标签:JobMaster,Flink,作业,TaskManager,学习,提交,数据,资源管理 From: https://www.cnblogs.com/lkd0910/p/16938541.html