源码分析Ambari的DAG是如何做的
来源:互联网 发布:fluent分析软件 编辑:程序博客网 时间:2024/05/20 14:17
我认为Ambari最有趣的地方之一是如何计算DAG(Directed acyclic graph,有向无环图)
简述
先简要概括一下Ambari是如何确定执行流程的:
ambari server会根据集群的元数据信息,在执行某一个Operation时候建立一个Stage DAG,根据这个DAG,划分不同的Stage,Stage间有执行顺序关系,必须按着顺序来;再根据每一个Stage,生成Command的DAG,将Command下发给ambari agent执行,第一个Stage的所有Command全部执行成功,才会执行第二个Stage,依次类推。
相关的类
当然,有很多细节需要补充,我们先认识几个类,按理解的重要性排序:
RoleGraphNode
第一个类:RoleGraphNode,它可以看成DAG的一个点
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
一个DAG的节点有两部分构成,Role和RoleCommand,
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
前面提到,Stage需要按顺序执行,那DAG如何确定顺序呢?
数据结构课都有上过,既然是一个有向无环图,那么先找到所有入度为0的nodes,这些nodes可以被划分在第一个Stage中,然后去掉这些nodes,以这些nodes为起点的边的终点的nodes的入度要-1,再找到所有入度为0的nodes,那么这些nodes可以被划分为第二个Stage,依次类推,就可以确定有多少个Stage和各个Stage的执行顺序。
在代码中是如何体现的呢?
每个RoleGraphNode都可以表示为一个(role, command, inDegree)三元组,比如(datanode, install, 0);
每个RoleGraphNode都有该节点的边的信息(Map
RoleCommandOrder
第二个类:RoleCommandOrder,它可以理解成是如何生成DAG的graph的规则:
- 1
判定规则函数实现如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
给定两个node:node1和node2
1. 如果node1 -> node2,则返回-1;
2. 如果node1和node2不存在先后关系,则返回0;
3. 反之,如果node2 -> node1,则返回1;
谁先谁后是根据command的类型决定:
INSTALL -> START -> EXECUTE -> SERVICE_CHECK -> STOP
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
这里要明确的是:
除了上面的规则,还有一类规则信息是config,比如有role_command_order.json这个配置文件给定的规则,这类规则通常规定了不同component之间的顺序关系,可以是一个service间的不同component,比如:
- 1
- 2
- 3
也可以是不同service间的不同component,比如:
- 1
- 2
- 3
再比如有service的metainfo.xml这个配置文件给定的规则,规定了service间的依赖关系:
- 1
- 2
- 3
- 4
- 5
RoleGraph
第三个类:RoleGraph,通过给定的nodes来划分Stage,提供了如下方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
这里要明确的是:有两种DAG
1. Stage间的DAG:根据nodes建立Stage DAG,即不同Stage的DAG;
2. Stage内部的DAG:根据给定Stage内部的nodes建立Task DAG,即不同Command的DAG;
- 源码分析Ambari的DAG是如何做的
- 源码分析Ambari的DAG是如何做的
- Ambari源码分析
- Ambari源码分析(一):Ambari架构
- [ACE源码分析]ACE_Reactor是如何做到事件分发的
- 源码分析视图动画是如何实现的
- [ACE源码分析]ACE_Reactor是如何做到事件分发的
- Appium源码分析(5)-请求是如何执行的
- 源码级分析app是如何被启动的
- 源码分析Rxjava2是如何完成链式调用的
- Tensorflow 源码分析-GPU调用是如何实现的
- 深入理解Spark 2.1 Core (二):DAG调度器的原理与源码分析
- 深入理解Spark 2.1 Core (二):DAG调度器的原理与源码分析
- Ambari源码分析之总览
- 新安装的 Discuz!X是如何判断是否是第一次安装的?相关源码分析
- Oracle的表分析是做什么的?
- android是如何做DNS解析的
- 计算机是如何做减法的?
- python零碎知识(6)--魔法方法、属性和迭代器
- C# 依据DataTable创建透视表
- JS堆栈和拷贝的理解
- 全面的Android文件目录解析和获取方法(包含对6.0系统的说明) simen201310 2016-08-28 15:52:12 浏览3290 评论0 移动开发与客户端 android 摘要
- Sony vegas Pro 14 v14.0中文版 附激活说明
- 源码分析Ambari的DAG是如何做的
- 浏览器err_invalid_argument解决方法
- Http TCP/IP UDP socket 解析
- python中函数是否加括号问题
- ccf-火车购票
- 性能测试知多少---响应时间
- python 数据结构 元组、列表、字典、序列
- JS作用域
- java实现二分查找