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表达式同样适用于shell action。

注意,mapred.job.tracker以及fs.default.name属性不能再shell action中直接配置。

在mapreduce任务中可以处理一些资源,这样shell就可以使用了。更多的内容参考[WorkflowFunctionalSpec#FilesAchives]``[Adding Files and Archives for the Job]章节。

shell的输出可以被后面的工作流任务使用,这些信息可以用来配置一些关键的信息。如果shell的输出想要对整个工作流任务可用,那么必须满足

  • 输出的格式是标准的java属性文件
  • 输出的内容不能超过2KB

语法

<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.3">
    ...
    <action name="[NODE-NAME]">
        <shell xmlns="uri:oozie:shell-action:0.1">
            <job-tracker>[JOB-TRACKER]</job-tracker>
            <name-node>[NAME-NODE]</name-node>
            <prepare>
               <delete path="[PATH]"/>
               ...
               <mkdir path="[PATH]"/>
               ...
            </prepare>
            <job-xml>[SHELL SETTINGS FILE]</job-xml>
            <configuration>
                <property>
                    <name>[PROPERTY-NAME]</name>
                    <value>[PROPERTY-VALUE]</value>
                </property>
                ...
            </configuration>
            <exec>[SHELL-COMMAND]</exec>
            <argument>[ARG-VALUE]</argument>
                ...
            <argument>[ARG-VALUE]</argument>
            <env-var>[VAR1=VALUE1]</env-var>
               ...
            <env-var>[VARN=VALUEN]</env-var>
            <file>[FILE-PATH]</file>
            ...
            <archive>[FILE-PATH]</archive>
            ...
            <capture-output/>
        </shell>
        <ok to="[NODE-NAME]"/>
        <error to="[NODE-NAME]"/>
    </action>
    ...
</workflow-app>
  • prepare元素,经常用于创建一系列的目录或者删除目录。注意目录必须是hdfs://host:port这种格式的。
  • job-xml元素,指定shell任务的配置。在0.2的schema中,job-xml元素允许指定多个job-xml文件。
  • configuration元素,包含了shell任务的配置信息。
  • exec元素,这个是必填项。包含了shell脚本的路径,并执行它。参数可以设置0个或者多个argument元素。
  • argument元素,用于传递给shell脚本。
  • env-var元素,可以设置环境变量,传递给shell脚本。env-var需要包含键值对这种的信息。比如包含$PATH这种信息,那么需要设置PATH=$PATH:mypath这种格式。不要使用${}这种语法,因为它会被认为是Oozie的EL表达式。
  • shell action也可以创建hadoop的配置。shell应用可以直接读取配置文件。
  • capture-output元素,用来指定输出端。shell命令输出必须是java属性这种格式,并且小于2kb.通过工作流的定义,输出也可以通过string action实现。

上面这些元素都支持EL表达式。

例子

如何运行shell或者perl脚本。

<workflow-app xmlns='uri:oozie:workflow:0.3' name='shell-wf'>
    <start to='shell1' />
    <action name='shell1'>
        <shell xmlns="uri:oozie:shell-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                  <name>mapred.job.queue.name</name>
                  <value>${queueName}</value>
                </property>
            </configuration>
            <exec>${EXEC}</exec>
            <argument>A</argument>
            <argument>B</argument>
            <file>${EXEC}#${EXEC}</file> <!--Copy the executable to compute node's current working directory -->
        </shell>
        <ok to="end" />
        <error to="fail" />
    </action>
    <kill name="fail">
        <message>Script failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name='end' />
</workflow-app>

用于提交oozie工作的参数有

oozie.wf.application.path=hdfs://localhost:8020/user/kamrul/workflows/script#Execute is expected to be in the Workflow directory.
#Shell Script to run
EXEC=script.sh
#CPP executable. Executable should be binary compatible to the compute node OS.
#EXEC=hello
#Perl script
#EXEC=script.pl
jobTracker=localhost:8021
nameNode=hdfs://localhost:8020
queueName=default

如何运行java程序并添加jar包

<workflow-app xmlns='uri:oozie:workflow:0.3' name='shell-wf'>
    <start to='shell1' />
    <action name='shell1'>
        <shell xmlns="uri:oozie:shell-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                  <name>mapred.job.queue.name</name>
                  <value>${queueName}</value>
                </property>
            </configuration>
            <exec>java</exec>
            <argument>-classpath</argument>
            <argument>./${EXEC}:$CLASSPATH</argument>
            <argument>Hello</argument>
            <file>${EXEC}#${EXEC}</file> <!--Copy the jar to compute node current working directory -->
        </shell>
        <ok to="end" />
        <error to="fail" />
    </action>
    <kill name="fail">
        <message>Script failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name='end' />
</workflow-app>

提交的相关参数

oozie.wf.application.path=hdfs://localhost:8020/user/kamrul/workflows/script#Hello.jar file is expected to be in the Workflow directory.
EXEC=Hello.jar
jobTracker=localhost:8021
nameNode=hdfs://localhost:8020
queueName=default

shell Action日志

shell action标准输出和错误输出都可以直接输出到oozie的mapreduce任务控制台上。

通过oozie web控制台,也可以看到它的执行日志。

shell action的限制

尽管shell可以执行任何的脚本命令,但是还是有一些限制的。

  • 不支持交互式的命令
  • 命令不能使用不同的用户执行
  • 用户必须严格控制上传的jar包。oozie会把他上传到分布式环境中进行缓存
  • 尽管oozie在hadoop的计算节点执行shell命令,但是可能有一些默认安装的工能是不支持的。因此需要了解,oozie可以支持安装在计算节点的命令。

实战分析

shell可以输出java properties格式的数据,并且可以配合EL表达式,在其他的action中使用。因此它可以作为工作流的初始化任务,以及配置服务。

比如,在脚本中:

#!/bin/sh
a=1
b=2
echo "a=$a"
echo "b=$b"

在其他的节点中就可以通过EL表达式来使用了。

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

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

Oozie分布式任务的工作流——脚本篇的相关文章

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

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

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

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

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

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

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

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

最近又开始捅咕上oozie了,所以回头还是翻译一下oozie的文档.文档里面最重要就属这一章了--工作流定义. 一提到工作流,首先想到的应该是工作流都支持哪些工作依赖关系,比如串式的执行,或者一对多,或者多对一,或者条件判断等等.Oozie在这方面支持的很好,它把节点分为控制节点和操作节点两种类型,控制节点用于控制工作流的计算流程,操作节点用于封装计算单元.本篇就主要描述下它的控制节点... 背景 先看看oozie工作流里面的几个定义: action,一个action是一个独立的任务,比如map

SQL SERVER修改排序规则——脚本篇

在上篇MS SQL 排序规则总结中, 大致就数据库服务器排序规则(或者叫数据库实例排序规则).数据库排序规则.列的排序规则粗浅的叙说了一遍,重点讲述了修改数据库服务器排序规则(数据库 实例排序规则),其中对于数据库排序规则的修改只是粗略带过.其实相对而言,修改服务器排序规则(数据库实例排序规则)相对简单一些,修改数据库的排序规 则就复杂多了,因为涉及到数据.SQL脚本等等,例如,一不小心,修改排序规则后,数据当中可能就会出现乱码: 另外,修改数据库排序规则麻烦的是要大量修改相关表的字段的排序规则

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

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

工作流调度器azkaban安装

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