本文主要内容
- 有向无环图
- 拓扑排序
- Oozie
有向无环图
什么是有向无环图
有向无环图(Directed Acyclic Graph, DAG)是有向图的一种,特点是图中没有环。常常被用来表示事件之间的驱动依赖关系,管理任务之间的调度。拓扑排序是对DAG的顶点进行排序,使得对每一条有向边(u, v),均有u(在排序记录中)比v先出现。亦可理解为对某点v而言,只有当v的所有源点均出现了,v才能出现。
image
为了描述一个Job内所有Task相互依赖关系,可以将Job中的每个Task对应为一个节点,将一个Job描述为一张有向无环图DAG
有向无环图对于构造一个任务必须发生在另一个任务之前的这种依赖模型特别有效。
度
入度:进入该顶点的边的个数称为该顶点的入度。
出度:从该顶点发出的边的个数。
判断一个图是否有环:
任何一个有向无环图中必定至少存在一个入度为0的顶点,至少存在一个出度为0的顶点,否则图中必存在环。
偏序和全序
偏序:图中的任意一对顶点要么有先后关系,要么没有关系,不存在互相矛盾的关系(环路)
全序:图中的任意一对顶点都有明确的关系
DAG的拓扑排序
由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(Topological sorting)。
image
拓扑排序的实现
算法实现片段:
<pre><code class="Python">
def kahn_topological(graphNodes):
"""
L← Empty list that will contain the sorted elements
S ← Set of all nodes with no incoming edges
:return: L list
"""
L = []
S = []
S =getZeroIncomingDegreeNode(graphNodes,S)
while len(S)>0:
zeroNode = S.pop()
L.append(zeroNode)
S = getZeroIncomingDegreeNode(graphNodes,S,zeroNode=zeroNode)
return L
</code></pre>
Oozie
什么是Oozie
Cloudera公司开源,Oozie是一个基于工作流引擎的服务器,可以在上面运行Hadoop的Map Reduce和Pig任务。它其实就是一个运行在Java Servlet容器(比如Tomcat)中的Javas Web应用。对于Oozie来说,工作流就是一系列的操作(比如Hadoop的MR,以及Pig的任务),这些操作通过有向无环图的机制控制。这种控制依赖是说,一个操作的输入依赖于前一个任务的输出,只有前一个操作完全完成后,才能开始第二个。以xml的形式写调度流程,可以调度mr,pig,hive,shell,jar
Oozie架构
C/S架构(具体解释可参考10种常见的软件架构模式)
Oozie简化架构图
image
Oozie执行任务的实现原理
<img src="https://ws1.sinaimg.cn/large/6a6e8236gy1fwejxca6k8j20o50dlabn.jpg"/>
- Oozie Server根据workflow.xml 提交一个map only的MR Job
- map根据封装用户定义的action,通过JobClient将lib包的jar包和- - job.xml提交JobTracker
- action Job开始工作
- callback/polling 获取action状态(正常情况下,通过callback URL通知完成)
网友评论