Oozie提供的多种动作(Action)

Oozie提供了多个内置的动作。如下列举了其中的一些,并进行了简要的描述。

1.MapReduce 用户提供Mapper类和Reducer类,并设置一些附属变量。

2.Shell 包含参数的Shell命令也可作为动作来执行。

3.Java 动作含有main方面的Java类,可以指定参数后执行。

4.Pig 可以执行Pig脚本。

5.Hive 可以执行Hive的HQL查询。

6.DistCp 可以执行DistCp命令,将数据拷贝到另一个HDFS集群

Hive Thrift Service Action

通过使用Hive Thrift Service可以解决胖客户端问题

$ cd ~
$ git clone git://github.com/edwardcapriolo/hive_test.git
$ cd hive test
$ mvn wagon:download-single
$ mvn exec:exec
$ mvn install
$ cd ~
$ git clone git://github.com/edwardcapriolo/m6d_oozie.git
$ mvn install

一个只包含两个查询过程的工作流示例

通过配置特定的目录结构可以创建一个工作流。这里的目录结构里含有我们所需要的JAR文件,一个是job.properties文件,另一个是worlkMowxml文件。这个目录必须创建在HDFS中,但最好先在本地创建好文件夹,然后将其拷贝到HDFS中:

$ mkdir myapp
$ mkdir myapp/lib
$ cp $HIVE_HOME/lib/*.jar myapp/lib/
$ cp m6d oozie-1.0.0.jar myapp/1ib/
$ cp hive_test-4.0.0.jar myapp/lib/

文件job.properties 中配置有文件系统NameNode地址和Jobtracker地址,Hadoop Job配置文件中的属性信息。

job.properties文件内容的例子

nameNode=hdfs://rs01.hadoop.pvt:34310
jobTracker=rjt.hadoop.pvt:34311
queueName=default
oozie.libpath=/user/root/oozie/test/1ib
oozie.wf.application.path=${nameNode}/user/root/oozie/test/main

文件worlkflowxml对动作进行了定义:

<workflow-app
xmlns="uri: oozie: workflow:0.2"name="java-main-wf">
<start to="create-node"/>
<!--The create-node actual defines a table if it does not already exist-->
<action name="create-node">
<java>
<job-tracker>${ jobTracker}</job-tracker>
<name-node>${ nameNode}</name-node>
<configuration>
<property>
<name>mapred. job. queue. name</name>
·
<value>${queueName}</value>
</property>
</configuration>
<main-class>com.m6d. oozie. HiveServiceBAction</main-class>
<arg>rhiveservice. hadoop. pvt</arg>
<arg>10000</arg>
<arg>CREATE TABLE IF NOT EXISTS zz_zz_abc(a int,b int)</arg>
</java>
<!--on success proceded to query node action-->
<ok to=l"query node"/>
<!--on fail end the job unsuccessfully-->
<error to="fail"/>
</action>
<!--populate the contents of the table with an insert overwrite query-->
<action name="query node">
<java>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${ nameNode}</name-node>
<configuration>
<property>
<name>mapred. job. queue. name</name>
<value>${queueName}</value>
</property>
</configuration>
<main-class>com.m6d. oozie. HiveServiceBAction</main-class>
<arg>rhiveservice. hadoop. pvt</arg>
<arg>10000</arg>
<arg>INSERT OVERWRITE TABLE zz zz abc SELECT dma code, site id FROM BCO WHERE dt=20120426 AND offer=4159 LIMIT 10</arg>
</java>
<ok to="end"/>
<error to="fail"/>
</action>
<killname="fail">
<message>Java failed,error message
[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kil1>
<end name="end"/>
</workflow-app>

Oozie 网页控制台

使用Oozie网页控制台可以获得操作执行的细节,也因此便于进行任务错误定位。http://binghe:11000/oozie/

工作流中的变量

基于完全静态查询的工作流是很有用的,但是并不太实用。Oozie中的大多数使用场景

获取输出

Oozie中还提供了一个可以放置到动作中的标记。通过这个标记可以捕获输出,并可以将其连同错误信息通过邮件发出或者将输出发送给其他处理过程。Oozie在每个动作中都设置了一个Java属性,它可以用于输出那些可以写人的文件名。如下代码展示了如何获取这个属性:

//配置属性
private static final String
OOZIE_ACTION_OUTPUT_PROPERTIES="oozie.action.output.properties";
//在main方法中调用
public static void main(String args[]) throws Exception{
String oozieProp=System.getProperty(OOZIE_ACTION_OUTPUT_PROPERTIES);
}

获取输出到变量

我们已经讨论了如何获取输出以及如何获取Oozie变量,将这两者结合在一起使用,就可以满足日常的工作流使用需求了。

<action name="create table">
<java>
<job-tracker>$(jobTracker}</job-tracker>
<name-node>${ nameNode}</name-node>
<configuration>
<property>
<name>mapred. job. queue. name</name>
<value>${ queueName}</value>
</property>
</configuration>
<main-class>test. RunShellProp</main-class>
<arg>/bin/date</arg>
<!--设置格式化-->
<arg>+x=%Y%m%d</arg>
<capture-output/>
</java>
<ok to="run query"/>
<error to="fail"/>
</action>
<!--调用-->
<arg>You said ${wf:actionData('create_table')['x']}</arg>