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

JobManager转化成executionGraph.deploy(),然后生成TDD发给TaskManager,然后整个Job就启动起来了

这里来看一下Driver端的实现从用户的Envirement.execute()方法作为入口

这里的Envirement分为

RemoteStreamEnvironment

LocalStreamEnvironment

因为local模式比较简单这里就不展开了,主要是看下RemoteStreamEnvironment的execute方法

可以看到这里先获取到了streamGraph,具体获取的实现

这里传入了一个transformations其中就包含了我们用户的所有operator

这个地方就是遍历了用户端所有的operator生成StreamGraph,遍历的每一个算子具体转化成streamGraph的逻辑

1处会递归遍历input直到input已经transfor,然后拿到了上游的ids

然后将operator加入到了streamGraph中调用addNode()方法将operator作为一个node,包含了一些信息,上下游的类型,并行度,soltGroup

最后遍历上游的ids,创建边添加到streamGraph

到这里streamGraph就创建完成了

回到最开始的地方,创建完streamGraph以后,会将streamGraph传入executeRemotely(streamGraph, jarFiles)这个方法,这里就是streamGraph转化成jobgraph的逻辑

其中创建了一个RestClusterClient

可以看到这里,通过getJobGraph方法将streamGraph转换成了jobgraph

然后就submitJob将这个JobGraph提交Jobmanager了

先看一下streamGraph如何转化成jobgraph的

通过getJobGraph方法然后

这个createJobGraph方法是主要的转化逻辑

广度优先遍历为所有streamGraph的node 即operator生成hash散列值,为什么要生成这个operator的hash?

因为这个hash需要作为每一个operator的唯一标示,标示每一个operator用于cp的恢复,当用户代码没有修改时,这个hash值是不会改变的

接下来

这里会将flink中上下游的operator操作根据是否满足chain条件链在一起,在createChian中

这个isChainable()方法就是是否可以chain的判断条件

1.下游的输入边只有一条

2.下游操作operator不为空

3.上游操作operator不为空

4.上游必须有相同的solt组

5.下游chain策略为always

6.上游chain策略为head或上游chain策略为always

7.forwardpartition的边

8.上下游并行度相同

9.用户代码设置的operator是否可以chian

将可以chain的streamnode 链在一起以后就可以创建成为jobGraph的jobVertex了

然后通过RestClusterClient会将这个jobGraph往jobmanager的Dispatcher对应的RPC接口上面发送,整个job的启动Driver端的任务就结束了

总结:

  在Driver端用户的算子会被创建成为streamGraph,其中包含了一些边,角,上下游类型,并行度等一些信息,然后将streamGraph通过一些chain条件将可以chain的顶点chain在了一起转化成了JobGraph

streamEdge变成了jobEdge,chain在一起的streamnode变成了jobVertex,然后通过RPC将整个jobGraph向jobmanager提交。

Flink的Job启动Driver端(源码分析)的更多相关文章

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

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

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

    通过前面的文章了解到 Driver将用户代码转换成streamGraph再转换成Jobgraph后向Jobmanager端提交 JobManager启动以后会在Dispatcher.java起来RPC ...

  3. kubelet分析-csi driver注册分析-Node Driver Registrar源码分析

    kubernetes ceph-csi分析目录导航 Node Driver Registrar分析 node-driver-registrar是一个sidecar容器,通过Kubelet的插件注册机制 ...

  4. kubelet分析-csi driver注册源码分析

    kubelet注册csi driver分析 kubelet注册csi driver的相关功能代码与kubelet的pluginManager有关,所以接下来对pluginManager进行分析.分析将 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. struct模块(用于对象的压缩)

    6.27自我总结 struct模块 1.struct模块中的函数 函数 return explain pack(fmt,v1,v2-) string 按照给定的格式(fmt),把数据转换成字符串(字节 ...

  2. [剑指offer] 10. 旋转数组的最小数字

    题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路: 利用dp[i]保存盖2*i的矩形有多少种办法. 通过 ...

  3. 2019年7月16日 abp(net core)+easyui+efcore实现仓储管理系统——多语言(十)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  4. bitset的简单用法

    1.头文件 #include<bitset> 2.基本操作 bitset<n> b; b有n位,每位都为0. 参数n可以为一个表达式.如bitset<5> b, 则 ...

  5. <java程序大集合>

    1.以下关于开发java程序的描述错误的是(). A.开发java程序的步骤包括:编写源程序,编译,运行 B.编写的java源程序文件使用.java作为扩展名 C:java源文件经编译后,生成后娺为. ...

  6. PHP与ECMAScript_5_常用数组相关函数

    PHP ECMAScript 长度 $length = count($array) length = array.length       增 array_unshift($array, new1,n ...

  7. 【Android Studio】E/memtrack: Couldn't load memtrack module (No such file or directory)【待解决】

    Android Studio 又遇到了问题--如下: 06-21 07:27:57.855 3232-3232/? E/memtrack: Couldn't load memtrack module ...

  8. 【iOS】Xcode 插件安装后无效

    今天把 Xcode 升级到 7.3.1,发现插件安装后无效…… 原因:苹果要求加入UUID证书从而保证插件的稳定性. 解决方法: 1. 查看Xcode的UUID 在终端输入以下命令: defaults ...

  9. 【Android Studio】Gradle DSL method not found:'android()'

    如图所示: 参考:http://www.jianshu.com/p/d370d41fb7da 又遇到了这个问题: 参考:http://stackoverflow.com/questions/24204 ...

  10. 面试必问之ArrayList

    ArrayList概述 (1)ArrayList 是一种变长的集合类,基于定长数组实现. (2)ArrayList 允许空值和重复元素,当往 ArrayList 中添加的元素数量大于其底层数组容量时, ...