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


    前篇讲述了下什么是流控制节点,本篇继续来说一下什么是 Action Nodes操作节点。Action节点有一些比较通用的特性:

    Action节点是远程的

    所有oozie创建的计算和处理任务都是异步的,没有任何应用是工作在oozie内部的。基本上都是创建一个oozie任务,oozie任务会以map的形式,在各个节点再创建相应的任务。因此当你执行spark任务的时候,就会发现yarn集群监控列表里面会同时有两个任务出现。

    Action节点是异步的

    oozie创建的任务都是异步的,对于大多数的任务来说,oozie都是创建action,然后一直等到这个action完成,才退出。对于fs的异常操作来说,是同步的。

    oozie可以通过两种方式检测任务是否完成——回调和轮训。

    当oozie创建一个任务时,会提供一个唯一的回调url,当任务完成时,会调用该url通知完成。当无法回调时,也可以采用轮训的机制,检测是否完成。

    Action有两种状态,ok和error

    如果任务异常退出,那么需要明确的提供error-code,这个信息可以用于decision控制节点进行决策选择。每个工作流都应该清晰的定义errorcode

    Action的恢复机制

    oozie对于不同的错误有不同的处理方式:

    • 对于那些偶然的错误,比如网络原因或者远程系统暂时不能访问,oozie会根据预先设置的参数进行重试。这个参数可以在action中进行重写。
    • 对于那些非偶然的错误,oozie会挂起任务,直到管理员或者外部系统手动解决。

    一些常用的Action

    FS Action

    fs Action允许操作hdfs上的文件或者目录,比如move,delete,mkdir,chmod,touchz,chgrp等等。

    这个FS命令都是同步执行的,只有节点完成该命令操作,才会继续往下执行。

    如果使用了路径,那么路径可以使用EL表达式参数化,但是一定要是绝对路径才行。对于move,delete,chmod,chgrp命令来说,可以使用通配符。但是对于move命令,只能给源路径使用通配。

    语法规则如下:

    <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.5">
        ...
        <action name="[NODE-NAME]">
            <fs>
                <delete path='[PATH]'/>
                ...
                <mkdir path='[PATH]'/>
                ...
                <move source='[SOURCE-PATH]' target='[TARGET-PATH]'/>
                ...
                <chmod path='[PATH]' permissions='[PERMISSIONS]' dir-files='false' />
                ...
                <touchz path='[PATH]' />
                ...
                <chgrp path='[PATH]' group='[GROUP]' dir-files='false' />
            </fs>
            <ok to="[NODE-NAME]"/>
            <error to="[NODE-NAME]"/>
        </action>
        ...
    </workflow-app>
    

    delete命令可以删除指定的路径的内容,如果目标是一个目录,那么会级联删除下面的所有内容。

    mkdir命令会创建指定的路径内容,如果路径上缺少父级目录,也会自动创建。如果目录已经存在,那么什么都不会做。

    move命令中,source路径必须要指定。下面是使用move的一些场景:

    • 文件系统URI(比如hdfs://{namenode})可以在target中省略,因为系统会默认使用source的URI。
    • target路径的父级目录都必须存在
    • 如果target目录已经存在,那么将会替换目标文件

    chmod命令可以改变路径的权限。权限跟linux类似,都是-rwxrw-rw-或者755的形式。默认的情况下权限会应用到目标目录以及其子文件。如果只想应用到目录而不影响它的文件,可以把dir-files属性设置为false.如果想要级联修改内部的所有文件,可以内部嵌套一个recursive元素.

    touchz命令在该文件不存在的时候会创建一个长度为0的文件。如果文件已经存在,那么仅会更新一下该文件的修改时间。touchz命令仅支持绝对路径。

    chgrp命令可以修改路径的所有组。属性跟chmod是一样的。

    举个例子:

    <workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.5">
        ...
        <action name="hdfscommands">
             <fs>
                <delete path='hdfs://foo:8020/usr/tucu/temp-data'/>
                <mkdir path='archives/${wf:id()}'/>
                <move source='${jobInput}' target='archives/${wf:id()}/processed-input'/>
                <chmod path='${jobOutput}' permissions='-rwxrw-rw-' dir-files='true'><recursive/></chmod>
                <chgrp path='${jobOutput}' group='testgroup' dir-files='true'><recursive/></chgrp>
            </fs>
            <ok to="myotherjob"/>
            <error to="errorcleanup"/>
        </action>
        ...
    </workflow-app>
    

    在其他的工作流节点中,也可以使用fs操作:

    <workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.4">
        ...
        <action name="hdfscommands">
            <fs>
               <name-node>hdfs://foo:8020</name-node>
               <job-xml>fs-info.xml</job-xml>
               <configuration>
                 <property>
                   <name>some.property</name>
                   <value>some.value</value>
                 </property>
               </configuration>
               <delete path='/usr/tucu/temp-data'/>
            </fs>
            <ok to="myotherjob"/>
            <error to="errorcleanup"/>
        </action>
        ...
    </workflow-app>
    

    这个功能在其他的工作流节点中是非常常用的,像我们平时使用的sqoop操作都需要实现执行以下delete删除目标数据。

  • 相关阅读:
    django框架进阶ModelForm组件长期维护
    crm项目stark组件
    前端html长期维护
    django框架进阶AJAX长期维护
    22python语法基础基础赋值与深浅拷贝
    django框架基础路由系统长期维护
    django框架基础ORM单表操作长期维护
    24python语法基础基础控制语句
    django框架基础ORM基础长期维护
    django框架基础ORM进阶长期维护
  • 原文地址:https://www.cnblogs.com/xing901022/p/6492867.html
Copyright © 2020-2023  润新知