Dispatcher (分发器,提供UI界面,将作业分发给JobManager)
JobManager(作业管理器)
TaskManager(任务管理器)
每一个Flink应用程序都对应一个JobManager,JobManager是一个控制程序执行的主进程,我们提交的Job就是提交给Jobmanager;
1.接受需要执行的Flink应用程序,这个程序包括作业图(JobManager)、逻辑数据流图(logic data-flow)、和打包的类、库以及其他依赖资源的jar包;
2.JobManager会将Jobgraph转化成一个物理的可执行的数据流图(ExecutionGraph),这里面就包含了可以执行的任务;
3.JobManager在生成物理执行图之后会向Resourcemanager申请对应的资源(Slot),一旦获取到资源,就会将执行图中的任务派发到不同的TaskManager上去执行,Flink会通过心跳获取任务执行信息,同时负责集群之间的协调通信,比如说checkpoint协调。
Task也是一个单独的JVM进程,Slot的数量决定了taskmanager同时能执行的task的数量
1.首先taskmanager会向资源管理器注册自己的Slot;收到资源管理器的指令后,就会提供1个或者多个插槽供job使用;
2.Taskmanager还要向Jobmanager通过心跳传输任务信息,同时还会与其他的taskmanager之间互相交互数据。
Yarn\K8s\Standalone等
任务分发器,将应用程序APP提交给JoBManager并提供WebUI界面
1.客户端上传jar包和配置
2.客户端向ResourceManager提交Job
3.Yarn-ResourceManger会在NodeManager上启动ApplicationMaster(整个程序的驱动进程),此时JobManager就已经启动
4.ApplicationMaster根据提交的配置申请相应的资源(Container)
5.资源申请之后,会在不同的NodeManager上分配Container并启动TaskManager,分配Slot与内存
6.TaskManager启动并向JobManager注册并通过心跳报告信息
7.此时job提交完成.
Flink中是允许子任务共享Slot的,在Slot中其实只是内存的隔离,Cpu是不进行隔离的;
具体调度可以看FlinkJob的执行图
StreamGraph -[通过chain将任务进行合并,在Client就生成了]>- JobGraph -[根据并行度划分子任务形成]-> ExecutionGraph ->物理执行图
算子有以下类型
One-to-one(map、filter、flatmap)
redistributing(keyby、groupby、rebalance、broadcast)类似于shuffle
形成jobGraph时的优化技术,将不同的算子任务连接成一个OperatorChain,这个优化有个前提条件:
只有并行度相同、one-to-one操作的算子才能合并成一个chain,关于chain的算子也有相关的操作
disableChaining():禁止当前算子与前后算子形成chain
startNewChain():这个算子与后续算子形成chain,与前面的算子进行隔离划分