Flink的Job启动JobManager端(源码分析)
通过前面的文章了解到
Driver将用户代码转换成streamGraph再转换成Jobgraph后向Jobmanager端提交
JobManager启动以后会在Dispatcher.java起来RPC方法submitJob(jobGraph),用于接收来自Driver转化得到的JobGraph来启动任务
具体来看jobGraph提交到JobManager的submitJob方法
前面都是一些调用链没有什么好讲的,最后到createJobManager( )方法这里
先看一下1,创建了一个jobmanagerRunner并且将中Driver端得到的JobGraph传递了进去
在创建JobManagerRunner的过程中它调用了
这里主要是为了创建一个jobMaster,在jobMaster的构造方法中
在这里它先是create传入了jobgraph然后又通过createAndRestoreExecutionGraph()方法转换得到executionGraph
这个executionGraph就可以用来调度启动任务了
具体看一下他的转化逻辑
可以看到它从createExecutionGraph方法中得到了executionGraph
并且通过getCheckpointCoordinator()方法得到了一个coordinator(主要是用于周期性触发checkpoint,调用对应TaskManager的rpc生成barriers往下游发送)
继续看一下他的转化逻辑
在createExecutionGraph中通过ExecutionGraphBuilder.buildGraph()返回了一个executionGraph
在buildGraph()方法中
创建了一个executionGraph
为executionGraph设置一些基础信息,包括调度方式等(这里stream是eager的调度方法)
然后
1处得到了一个的拓扑图包含了所有jobGraph的所有jobVertex节点
2处就是具体遍历所有jobGraph的jobVertex生成executionGraph的顶点ExecutionJobVertex
遍历所有jobGraph的顶点jobVertex
在这里就具体生成了ExecutionJobVertex中的每一个ExecutionVertex[] taskVertices
当然这里还会配置很多ExecutionGraph的信息,就不一一列举了
配置了一些ExecutionGraph的属性以后
调用了
可以看到我的注释,就是说这个地方其实是和coordinator的创建有关,在这个方法中
创建了一个coordinator对象
在这里注册了一个JobStatus的监听
来看一下这个监听的作用
可以看到源码上的注解就是说用于监听job状态的改变,具体监听
看到这里就非常明显了
当监听到jobstutes的状态改变时
当jobstatus变成Running时调用了coordinator的.startCheckpointScheduler()方法其中
这里可以看到创建了一个周期的调度线程
看下线程的run方法
这里就真相大白了,调用了triggerCheckpoint方法触发一次checkpoint(触发checkpoint的逻辑以后随缘更新到再讲)
注意,前面说到只是注册了一个监听,也就是说这个coordinator现在其实还没有启动起来的!!要到监听到jobStatus变成running才会启动
回到最开始的这里
1处转化成executionGraph以后
2处具体看一下这个startJobManagerRunner()方法
把jobManager启动了起来
在其中
启动了这个jobMasterService
在这里开启了jobmaster的一些RPC,像什么cancel job的stop job 的还有register TM的
然后startJobExecution()方法中
这里其实会向jobManager中启动的resourceManager的RPC请求solt信息初始化自己的的soltPool这里不细讲了,我还没有研究
后面
这个地方就是修改job状态和调度运行了
其中调用了scheduleExecutionGraph(),在其中又调用了
这个地方比较重要,在其中先
\
这里它就通过CAS修改了jobStatue从Created变成了Running
修改完了以后还没完,还通过这个方法notifyJobStatusChange(),这个方法里面具体看一看
他遍历了所有的listener,也就是说会触发我们前面注册的那个coordinator的监听监听到job状态改变为running
这里coordinator就启动完成了
继续往下,在修改完job状态以后
因为流模式这里是用的EAGER,flink批处理我不熟这里就不展开了
在这个schduleEager方法中
然后
看到这里它创建了一个TaskDeploymentDescriptor一个用于调度TaskManager端任务的tdd对象
看过前面几篇博客的同学,就应该有印象了,在TaskManager启动会启动很多的RPC接口
其中有一个
一目了然了,这个东西是用来发送给TaskManager用于启动TaskManager端任务的!!!!
到这里jobManager端的job启动任务就差不多完成了
接下来就是TaskManager端的任务了,随缘更新的时候在说一下真正TaskManager节点是如何启动我们job任务的
Flink的Job启动JobManager端(源码分析)的更多相关文章
- Flink的Job启动TaskManager端(源码分析)
前面说到了 Flink的JobManager启动(源码分析) 启动了TaskManager 然后 Flink的Job启动JobManager端(源码分析) 说到JobManager会将转化得到 ...
- Flink的Job启动Driver端(源码分析)
整个Flink的Job启动是通过在Driver端通过用户的Envirement的execute()方法将用户的算子转化成StreamGraph,然后得到JobGraph通过远程RPC将这个JobGra ...
- Flink中Idle停滞流机制(源码分析)
前几天在社区群上,有人问了一个问题 既然上游最小水印会决定窗口触发,那如果我上游其中一条流突然没有了数据,我的窗口还会继续触发吗? 看到这个问题,我蒙了???? 对哈,因为我是选择上游所有流中水印最小 ...
- Android Activity Deeplink启动来源获取源码分析
一.前言 目前有很多的业务模块提供了Deeplink服务,Deeplink简单来说就是对外部应用提供入口. 针对不同的跳入类型,app可能会选择提供不一致的服务,这个时候就需要对外部跳入的应用进行区分 ...
- Netty服务端启动过程相关源码分析
1.Netty 是怎么创建服务端Channel的呢? 我们在使用ServerBootstrap.bind(端口)方法时,最终调用其父类AbstractBootstrap中的doBind方法,相关源码如 ...
- Flink中异步AsyncIO的实现 (源码分析)
先上张图整体了解Flink中的异步io 阿里贡献给flink的,优点就不说了嘛,官网上都有,就是写库不会柱塞性能更好 然后来看一下, Flink 中异步io主要分为两种 一种是有序Ordered 一种 ...
- Flink中的CEP复杂事件处理 (源码分析)
其实CEP复杂事件处理,简单来说你可以用通过类似正则表达式的方式去表示你的逻辑,表现能力非常的强,用过的人都知道 开篇先偷一张图,整体了解Flink中的CEP中的 一种重要的图 NFA非确定有限状 ...
- Flink 中LatencyMarks延迟监控(源码分析)
流式计算中处理延迟是一个非常重要的监控metric flink中通过开启配置 metrics.latency.interval 来开启latency后就可以在metric中看到askManage ...
- spring mvc 启动过程及源码分析
由于公司开源框架选用的spring+spring mvc + mybatis.使用这些框架,网上都有现成的案例:需要那些配置文件.每种类型的配置文件的节点该如何书写等等.如果只是需要项目能够跑起来,只 ...
随机推荐
- K-Means(K均值)、GMM(高斯混合模型),通俗易懂,先收藏了!
1. 聚类算法都是无监督学习吗? 什么是聚类算法?聚类是一种机器学习技术,它涉及到数据点的分组.给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组.理论上,同一组中的数据点应该具有相似 ...
- Java--UTF-8
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码.由Ken Thompson于1992年创建.现在已经标准化为 ...
- python下载报错:Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问
更新pip模块的版本:python -m pip install --upgrade pip 但是遇到报错提示: Could not install packages due to an Enviro ...
- python3 读取文件-2
1.脚本 from sys import argv script,filename = argv#以读的模式打开txt文件txt = open(filename,'r+')print ("t ...
- Linux内核OOM killer机制
程序运行了一段时间,有个进程挂掉了,正常情况下进程不会主动挂掉,简单分析后认为可能是运行时某段时间内存占用过大,系统内存不足导致触发了Linux操作系统OOM killer机制,将运行中的进程杀掉了. ...
- Transformations 方块转换 USACO 模拟 数组 数学 耐心
1006: 1.2.2 Transformations 方块转换 时间限制: 1 Sec 内存限制: 128 MB提交: 10 解决: 7[提交] [状态] [讨论版] [命题人:外部导入] 题目 ...
- H3C模拟器单臂路由配置实例
单臂路由:用802.1Q和子接口实现VLAN间路由 单臂路由利用trunk链路允许多个VLAN的数据帧通过而实现 网络拓扑图: RTA配置: SW1配置: PC1/2配置如图: 但是值得注意的是,在配 ...
- MySQL Schema与数据类型优化
Schema与数据类型优化 选择优化的数据类型 1.更小的通常更好 更小的数据类型通常更快,因为它们占用更少的磁盘,内存和CPU缓存 2.简单就好 简单数据类型的操作通常需要更少的CPU周期.例如:整 ...
- js中slice和splice的区别
言简意赅,直接上货. slice():该方法会返回一个新的数组,强调:新数组,并不会影响原来的数组.先来看看语法咋说:arrayObject.slice(start,end).其中,start必需,e ...
- word 文档导出 (freemaker+jacob)--java开发
工作中终于遇到了 需要导出word文旦的需求了.由于以前没有操作过,所以就先百度下了,基本上是:博客园,简书,CDSN,这几大机构的相关帖子比较多,然后花了2周时间 才初步弄懂. 学习顺序: 第一阶 ...