前篇讲述了下什么是流控制节点,本篇继续来说一下什么是 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删除目标数据。

Oozie分布式工作流——Action节点的更多相关文章

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

    Oozie支持Java Action,因此可以自定义很多的功能.本篇就从理论和实践两方面介绍下Java Action的妙用,另外还涉及到oozie中action之间的参数传递. 本文大致分为以下几个部 ...

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

    最近又开始捅咕上oozie了,所以回头还是翻译一下oozie的文档.文档里面最重要就属这一章了--工作流定义. 一提到工作流,首先想到的应该是工作流都支持哪些工作依赖关系,比如串式的执行,或者一对多, ...

  3. Oozie workflow工作流action间参数传递实现

    假设workflow里有两个action节点,shell和hive,hive需要用到shell节点里的值,shell脚本如下 #!/bin/sh day=`date '+%Y%m%d%H'` echo ...

  4. Oozie分布式工作流——EL表达式

    oozie支持使用EL(expression language)表达式. 基本的EL常量 KB MB GB TB PB 基本EL函数 string firstNotNull(String value1 ...

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

    在大数据的当下,各种spark和hadoop的框架层出不穷.各种高端的计算框架,分布式任务如乱花般迷眼.你是否有这种困惑!--有了许多的分布式任务,但是每天需要固定时间跑任务,自己写个调度,既不稳定, ...

  6. 分布式工作流任务调度系统Easy Scheduler正式开源

    分布式工作流任务调度系统Easy Scheduler正式开源 1.背景 在多位技术小伙伴的努力下,经过近2年的研发迭代.内部业务剥离及重构,也经历一批种子用户试用一段时间后,EasyScheduler ...

  7. 开源分布式工作流任务调度系统Easy Scheduler Release 1.0.2发布

    Easy Scheduler Release 1.0.2===Easy Scheduler 1.0.2是1.x系列中的第三个版本.此版本增加了调度开放接口.worker分组(指定任务运行的机器组).任 ...

  8. Struts2第三篇【Action开发方式、通配符、Struts常量、跳转全局视图、action节点默认配置】

    前言 上篇Struts博文已经讲解了Struts的开发步骤以及执行流程了-..对Struts的配置文件有了了解-..本博文继续讲解Struts在配置的时候一些值得要学习的细节- Action开发的三种 ...

  9. Hadoop 分布式环境slave节点重启忽然不好使了

    Hadoop 分布式环境slaves节点重启: 忽然无法启动DataNode和NodeManager处理: 在master节点: vim /etc/hosts: 修改slave 节点的IP (这个时候 ...

随机推荐

  1. centos6.5下java和tomcat环境部署

    软件包: tomcat安装包 apache-tomcat-7.0.67.zip jdk安装包 jdk-6u10-linux-x64.bin 下载地址:http://www.oracle.com/tec ...

  2. Expm 1_3 数组中逆序对个数问题

    有一个数的序列A[1].A[2] .A[3] .…… .A[n],若i<j,并且A[i]>A[j],则称A[i]与A[j]构成了一个逆序对,设计算法求数列A中逆序对的个数. package ...

  3. PYTHON-面向对象 类 绑定方法

    面向对象三大特性(*****) 1继承 1. 什么是继承 继承是一种新建类的方式,新建的类称之为子类/派生类,被继承的类称之为父类/基类/超类 继承与现实生活中的继承一个意思 (例如 小明继承小明他爹 ...

  4. Linux查看文件命令

    linux查看日志文件内容命令有 cat 由第一行开始显示文件内容 tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写 nl 显示的时候,顺道输出行号! more 一页一页的显示文件内 ...

  5. 测试开发之Django——No5.Django项目的部署(CentOS7+nginx)

    配置环境:CentOS7 1.安装python3环境 默认的CentOS7系统中,会安装python2.7的版本,由于Django2.0并不支持python2.7的版本,所以我们需要自己在系统中安装p ...

  6. CentOS配置通过DHCP的方式动态获取IP

    修改/etc/sysconfig/network NETWORKING=yes 修改/etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBO ...

  7. 【ES】学习4-结构化搜索

    1. 结构化搜索得到的结果只有是和否,没有相似概念. term可以实现精确值查询 curl -XGET 'localhost:9200/logstash-cowrie/_search?pretty' ...

  8. jquery----语法扩展(导入js文件)

    简单使用 第一步,新建js文件 第二步,在js文件中添加 $.extend({ "GDP": function () { console.log("哈哈哈哈") ...

  9. 数论-质数 poj2689,阶乘分解,求阶乘的尾零hdu1124, 求尾零为x的最小阶乘

    /* 要求出[1,R]之间的质数会超时,但是要判断[L,R]之间的数是否是素数却不用筛到R 因为要一个合数n的最大质因子不会超过sqrt(n) 所以只要将[2,sqrt(R)]之间的素数筛出来,再用这 ...

  10. 2017-2018-2 20155225《网络对抗技术》实验九 Web安全基础

    2017-2018-2 20155225<网络对抗技术>实验九 Web安全基础 WebGoat 1.String SQL Injection 题目是想办法得到数据库所有人的信用卡号,用Sm ...