Oozie分布式工作流——流控制

最近又开始捅咕上oozie了,所以回头还是翻译一下oozie的文档。文档里面最重要就属这一章了——工作流定义。

一提到工作流,首先想到的应该是工作流都支持哪些工作依赖关系,比如串式的执行,或者一对多,或者多对一,或者条件判断等等。Oozie在这方面支持的很好,它把节点分为控制节点和操作节点两种类型,控制节点用于控制工作流的计算流程,操作节点用于封装计算单元。本篇就主要描述下它的控制节点...

背景

先看看oozie工作流里面的几个定义:

  • action,一个action是一个独立的任务,比如mapreduce,pig,shell,sqoop,spark或者java程序,它也可能是引用了某个action节点。
  • workflow,它是一组action的集合,内部控制了节点间的依赖关系,DAG(Direct Acyclic Graph),一个action依赖另一个action,就意味着只有前一个action运行完成,才能继续运行下一个。
  • worklfow definition,是可执行的workflow的描述
  • workflow definition language,定义了workflow的语言
  • workflow jon,是一个workflow的实例
  • workflow engine,用来执行workflow的系统

在oozie里面,工作流就是一组操作的集合,他们之前包含了前后依赖的关系,比如hadoop,pig等等。工作流里面可以包含fork和join的节点,用于把任务水平拆分成多个,并行执行,然后再合并到一起。

在oozie中,工作流的状态可以是:

PREP   RUNNING   SUSPENDED   SUCCEEDED   KILLED   FAILED

当任务失败时,oozie会通过参数控制进行重试,或者直接退出。

工作流定义

一个工作流的定义包含了 流控制节点(比如start,end,decision,fork,join,kill)以及action节点(比如map-reduce,spark,sqoop,java,shell等),节点直接都是通过有向箭头相连。

注意:在oozie里面是不支持环路的,工作流必须是严格的单向DAG。

工作流节点

工作流节点的命名规则需要满足=[a-zA-Z][\-_a-zA-Z0-0]*=,并且长度在20个字符以内。

流控制节点

流控制节点一般都是定义在工作流开始或者结束的位置,比如start,end,kill等。以及提供工作流的执行路径机制,如decision,fork,join等。

start

start节点是工作流的入口,workflow第一个action就需要是start。当工作流启动后,会自动寻找start节点执行。每个工作流都需要有一个start节点。

例如:

<workflow-app name="foo-wf" xmlns="uri:oozie:workflow:0.1">
    ...
    <start to="firstHadoopJob"/>
    ...
</workflow-app>

end

end节点是工作流执行成功的最后一个节点,当到达end节点后,工作流的状态会变成SUCCEEDED.如果有多个action指向了end,那么当第一个action执行后就会直接跳转到end节点,虽然后面的action都没有执行,但是workflow也认为是成功执行了。

例如:

<workflow-app name="foo-wf" xmlns="uri:oozie:workflow:0.1">
    ...
    <end name="end"/>
</workflow-app>

kill

kill节点允许工作流自动停止,当工作流执行到kill时,工作流的状态将会被认为是KILLED。如果有一个或者多个节点指向了kill,那么工作流都会被停止。一个workflow可以声明零个或者多个节点。

其中name属性是kill节点的名称,message指定了工作流退出的原因。

<workflow-app name="foo-wf" xmlns="uri:oozie:workflow:0.1">
    ...
    <kill name="killBecauseNoInput">
        <message>Input unavailable</message>
    </kill>
    ...
</workflow-app>

decision

decision节点支持给工作流提供选择,有点类似switch-case的语法。它使用JSP表达式语法,来进行条件判断。

比如:

<workflow-app name="foo-wf" xmlns="uri:oozie:workflow:0.1">
    ...
    <decision name="mydecision">
        <switch>
            <case to="reconsolidatejob">
              ${fs:fileSize(secondjobOutputDir) gt 10 * GB}
            </case> <case to="rexpandjob">
              ${fs:fileSize(secondjobOutputDir) lt 100 * MB}
            </case>
            <case to="recomputejob">
              ${ hadoop:counters('secondjob')[RECORDS][REDUCE_OUT] lt 1000000 }
            </case>
            <default to="end"/>
        </switch>
    </decision>
    ...
</workflow-app>

fork和join

fork节点把任务切分成多个并行任务,join则合并多个并行任务。fork和join节点必须是成对出现的。join节点合并的任务,必须是通一个fork出来的子任务才行。

<workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.1">
    ...
    <fork name="forking">
        <path start="firstparalleljob"/>
        <path start="secondparalleljob"/>
    </fork>
    <action name="firstparallejob">
        <map-reduce>
            <job-tracker>foo:8021</job-tracker>
            <name-node>bar:8020</name-node>
            <job-xml>job1.xml</job-xml>
        </map-reduce>
        <ok to="joining"/>
        <error to="kill"/>
    </action>
    <action name="secondparalleljob">
        <map-reduce>
            <job-tracker>foo:8021</job-tracker>
            <name-node>bar:8020</name-node>
            <job-xml>job2.xml</job-xml>
        </map-reduce>
        <ok to="joining"/>
        <error to="kill"/>
    </action>
    <join name="joining" to="nextaction"/>
    ...
</workflow-app>

在oozie里面,这种fork和join的机制是非常有用的,它可以把水平的任务并行执行,这样能更有效的利用集群的资源,避免资源闲置浪费。

如果使用HUE图形化界面的话,这些流控制节点基本上都是自动生成的,用户可以不需要关注。但是为了能看懂实际的任务,最好还是了解一下他们的关系。

本文转自博客园xingoo的博客,原文链接:Oozie分布式工作流——流控制,如需转载请自行联系原博主。

时间: 2024-08-01 05:17:40

Oozie分布式工作流——流控制的相关文章

Oozie分布式工作流——Action节点

前篇讲述了下什么是流控制节点,本篇继续来说一下什么是 Action Nodes操作节点.Action节点有一些比较通用的特性: Action节点是远程的 所有oozie创建的计算和处理任务都是异步的,没有任何应用是工作在oozie内部的.基本上都是创建一个oozie任务,oozie任务会以map的形式,在各个节点再创建相应的任务.因此当你执行spark任务的时候,就会发现yarn集群监控列表里面会同时有两个任务出现. Action节点是异步的 oozie创建的任务都是异步的,对于大多数的任务来说

Oozie分布式工作流——从理论和实践分析使用节点间的参数传递

Oozie支持Java Action,因此可以自定义很多的功能.本篇就从理论和实践两方面介绍下Java Action的妙用,另外还涉及到oozie中action之间的参数传递. 本文大致分为以下几个部分: Java Action教程文档 自定义Java Action实践 从源码的角度讲解Java Action与Shell Action的参数传递. 如果你即将或者想要使用oozie,那么本篇的文章将会为你提供很多参考的价值. Java Action文档 java action会自动执行提供的jav

Oozie分布式任务的工作流——邮件篇

在大数据的当下,各种spark和hadoop的框架层出不穷.各种高端的计算框架,分布式任务如乱花般迷眼.你是否有这种困惑!--有了许多的分布式任务,但是每天需要固定时间跑任务,自己写个调度,既不稳定,又没有可靠的通知. 想要了解Oozie的基础知识,可以参考这里 那么你应该是在找--Oozie. Oozie是一款支持分布式任务调度的开源框架,它支持很多的分布式任务,比如map reduce,spark,sqoop,pig甚至shell等等.你可以以各种方式调度它们,把它们组成工作流.每个工作流节

Oozie分布式任务的工作流——脚本篇

继前一篇大体上翻译了Email的Action配置,本篇继续看一下Shell的相关配置. Shell Action Shell Action可以执行Shell脚本命令,工作流会等到shell完全执行完毕后退出,再执行下一个节点.为了运行shell,必须配置job-tracker以及name-node,并且设置exec来执行shell. Shell既可以使用job-xml引用一个配置文件,也可以在shell action内直接配置.shell action中的配置会覆盖job-xml中的配置. EL

Oozie分布式任务的工作流——Sqoop篇

Sqoop的使用应该是Oozie里面最常用的了,因为很多BI数据分析都是基于业务数据库来做的,因此需要把mysql或者oracle的数据导入到hdfs中再利用mapreduce或者spark进行ETL,生成报表信息. 因此本篇的Sqoop Action其实就是运行一个sqoop的任务而已. 同样action会等到sqoop执行成功后,才会执行下一个action.为了运行sqoop action,需要提供job-tracker,name-node,command或者arg元素. sqoop act

Oozie分布式任务的工作流——Spark篇

Spark是现在应用最广泛的分布式计算框架,oozie支持在它的调度中执行spark.在我的日常工作中,一部分工作就是基于oozie维护好每天的spark离线任务,合理的设计工作流并分配适合的参数对于spark的稳定运行十分重要. Spark Action 这个Action允许执行spark任务,需要用户指定job-tracker以及name-node.先看看语法规则: 语法规则 <workflow-app name="[WF-DEF-NAME]" xmlns="uri

大数据学习之路(持续更新中...)

在16年8月份至今,一直在努力学习大数据大数据相关的技术,很想了解众多老司机的学习历程.因为大数据涉及的技术很广需要了解的东西也很多,会让很多新手望而却步.所以,我就在自己学习的过程中总结一下学到的内容以及踩到的一些坑,希望得到老司机的指点和新手的借鉴. 前言 在学习大数据之前,先要了解他解决了什么问题,能给我们带来什么价值.一方面,以前IT行业发展没有那么快,系统的应用也不完善,数据库足够支撑业务系统.但是随着行业的发展,系统运行的时间越来越长,搜集到的数据也越来越多,传统的数据库已经不能支撑

分布式版本控制系统入门:学习和对比Bazaar、Mercurial和Git的使用方法

简介:您是否对分布式版本控制感兴趣,但是又被一大堆行话弄糊涂了?本文介绍三种主要的系统 (Git.Mercurial 和 Bazaar),讨论采用分布式工作流的一些优点,比较分布式版本控制的常用操作. 简介 在过去几年,对于分布式版本控制可以给开发过程提供的益处有许多争论.最近,分布式 工具已经很成熟了.尽管分布式工具的一些优点最初可能不明显,但是从长期来看,它们提供的灵活性是 非常有意义的.阅读完本文之后,您应该能够开始使用分布式版本控制系统,基本了解分布式模型能够提 供的优点. 围绕分布式版

工作流调度器azkaban安装

概述 2.1.1为什么需要工作流调度系统 一个完整的数据分析系统通常都是由大量任务单元组成: shell脚本程序,java程序,mapreduce程序.hive脚本等 各任务单元之间存在时间先后及前后依赖关系 为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行; 例如,我们可能有这样一个需求,某个业务系统每天产生20G原始数据,我们每天都要对其进行处理,处理步骤如下所示: 1. 通过Hadoop先将原始数据同步到HDFS上; 2. 借助MapReduce计算框架对原始数据进行转