zoukankan      html  css  js  c++  java
  • 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表达式来使用了。

  • 相关阅读:
    How do you Design a Circular FIFO Buffer (Queue) in C?

    搞懂分布式技术5:Zookeeper的配置与集群管理实战
    Spring boot 启动提示数据源错误
    IntelliJ IDEA 如何配置数据源
    Windows 10 中你可能用得最多的快捷键
    JUnit 5 测试问题 throws java.lang.Exception’ must be static unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS)
    Intellij IDEA 如何自动生成 serialVersionUID
    Docsify 初始化文件夹
    Docsify 安装
  • 原文地址:https://www.cnblogs.com/xing901022/p/6079665.html
Copyright © 2011-2022 走看看