通过前面的文章了解到

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端(源码分析)的更多相关文章

  1. Flink的Job启动TaskManager端(源码分析)

    前面说到了  Flink的JobManager启动(源码分析)  启动了TaskManager 然后  Flink的Job启动JobManager端(源码分析)  说到JobManager会将转化得到 ...

  2. Flink的Job启动Driver端(源码分析)

    整个Flink的Job启动是通过在Driver端通过用户的Envirement的execute()方法将用户的算子转化成StreamGraph,然后得到JobGraph通过远程RPC将这个JobGra ...

  3. Flink中Idle停滞流机制(源码分析)

    前几天在社区群上,有人问了一个问题 既然上游最小水印会决定窗口触发,那如果我上游其中一条流突然没有了数据,我的窗口还会继续触发吗? 看到这个问题,我蒙了???? 对哈,因为我是选择上游所有流中水印最小 ...

  4. Android Activity Deeplink启动来源获取源码分析

    一.前言 目前有很多的业务模块提供了Deeplink服务,Deeplink简单来说就是对外部应用提供入口. 针对不同的跳入类型,app可能会选择提供不一致的服务,这个时候就需要对外部跳入的应用进行区分 ...

  5. Netty服务端启动过程相关源码分析

    1.Netty 是怎么创建服务端Channel的呢? 我们在使用ServerBootstrap.bind(端口)方法时,最终调用其父类AbstractBootstrap中的doBind方法,相关源码如 ...

  6. Flink中异步AsyncIO的实现 (源码分析)

    先上张图整体了解Flink中的异步io 阿里贡献给flink的,优点就不说了嘛,官网上都有,就是写库不会柱塞性能更好 然后来看一下, Flink 中异步io主要分为两种 一种是有序Ordered 一种 ...

  7. Flink中的CEP复杂事件处理 (源码分析)

    其实CEP复杂事件处理,简单来说你可以用通过类似正则表达式的方式去表示你的逻辑,表现能力非常的强,用过的人都知道 开篇先偷一张图,整体了解Flink中的CEP中的  一种重要的图  NFA非确定有限状 ...

  8. Flink 中LatencyMarks延迟监控(源码分析)

    流式计算中处理延迟是一个非常重要的监控metric flink中通过开启配置   metrics.latency.interval  来开启latency后就可以在metric中看到askManage ...

  9. spring mvc 启动过程及源码分析

    由于公司开源框架选用的spring+spring mvc + mybatis.使用这些框架,网上都有现成的案例:需要那些配置文件.每种类型的配置文件的节点该如何书写等等.如果只是需要项目能够跑起来,只 ...

随机推荐

  1. Flutter学习笔记(10)--容器组件、图片组件

    如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 上一篇Flutter学习笔记(9)--组件Widget我们说到了在Flutter中一个非常重要的理念"一切皆为组件 ...

  2. MyEclipse 2016 Stable 1.0破解教程

    一.下载所需文件 1. Windows最新版: MyEclipse 2016 Stable 1.0离线安装包(文件大小:1.52GB)--完整安装包,无需在线下载http://pan.baidu.co ...

  3. python课堂整理6---字典

    一.字典  dict info = {"k1" : "v1", "k2" : "v2"} 以键值对形式组成字典 字典里的 ...

  4. python UUID

    UUID介绍 UUID是128位的全局唯一标识符,通常由32字节的字符串表示.它可以保证时间和空间的唯一性,也称为GUID,全称为:UUID ―― Universally Unique IDentif ...

  5. HTTP 400 Bad request 原因

    我在使用httpclient 发送http请求时遇到问题,请求报 400 Bad request.网上都在说下面这两个原因 400 是 HTTP 的状态码,主要有两种形式: 1.bad request ...

  6. AbstractList

    概述 此类提供 List 接口的骨干实现,以最大限度地减少实现“随机访问”数据存储(如数组)支持的该接口所需的工作.对于连续的访问数据(如链表),应优先使用 AbstractSequentialLis ...

  7. 【iOS】PLA 3.3.12

    发件人 Apple Program License Agreement PLA We found that your app uses the Advertising Identifier but d ...

  8. 利用dockerfile 安装一个nginx-1.14.1

    FROM docker.io/centos MAINTAINER jim 107420988@qq.com ENV TZ "Asia/Shanghai" #ENV TERM xte ...

  9. hdoj 3732 Ahui Writes Word (多重背包)

    之前在做背包的题目时看到了这道题,一看,大喜,这不是裸裸的01背包吗!!  然后华丽丽的超时,相信很多人也和我一样没有考虑到数据量的大小. 时隔多日,回过头来看这道题,依旧毫无头绪....不过相比之前 ...

  10. Flink 从0到1学习 —— Flink 中如何管理配置?

    前言 如果你了解 Apache Flink 的话,那么你应该熟悉该如何像 Flink 发送数据或者如何从 Flink 获取数据.但是在某些情况下,我们需要将配置数据发送到 Flink 集群并从中接收一 ...