`
ghost_face
  • 浏览: 54425 次
社区版块
存档分类
最新评论

Oozie的JavaAction使用

 
阅读更多

1编写自定义功能的main函数

功能:得到指定目录的信息(该目录下文件个数、该目录的修改时间),并将信息反馈给oozie

代码如下:

package myTest.oozie;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.Properties;
 
public class GetDirInfo {
//javaAction的输出是一个属性文件
    private static final String OOZIE_ACTION_OUTPUT_PROPERTIES = "oozie.action.output.properties";
 
    public static void main(String[] args) throws Exception {
        String dirPath = "/user/abc/archer";
        String propKey0 = "dir.num-files";
        String propVal0 = "-1";
        String propKey1 = "dir.modified-time";
        String propVal1 = "-1";
        System.out.println("Directory path: '" + dirPath + "'");
 
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(conf);
        Path hadoopDir = new Path(dirPath);
        if (fs.exists(hadoopDir)) {
            FileStatus[] files = FileSystem.get(conf).listStatus(hadoopDir);
            int numFilesInDir = files.length;
            propVal0 = Integer.toString(numFilesInDir);
            FileStatus fileStatus = FileSystem.get(conf).getFileStatus(hadoopDir);
            Date date = new Date(fileStatus.getModificationTime());
            propVal1 = date.toLocaleString();
        }
        System.out.printf("%s,%s",propVal0,propVal1);
        String oozieProp = System.getProperty(OOZIE_ACTION_OUTPUT_PROPERTIES);
        if (oozieProp != null) {
            File propFile = new File(oozieProp);
            Properties props = new Properties();
            props.setProperty(propKey0, propVal0);
            props.setProperty(propKey1, propVal1);
            OutputStream os = new FileOutputStream(propFile);
            props.store(os, "");
            os.close();
        } else
            throw new RuntimeException(OOZIE_ACTION_OUTPUT_PROPERTIES
                    + " System property not defined");
    }
}

 

2.编写workflow.xml文件

文件如下,其中<main-class>指定要使用的类,<capture-output/>表示获取JavaAction的输出。

工作流的过程:

第一步,通过javaAction得到指定目录的信息,并将结果写到"oozie.action.output.properties"文件中,反馈给oozie,成功则进入下一步,否则error

第二步,通过EL Function${wf:actionData('getDirInfo')['dir.num-files'] eq 41},读取输出结果,并进行判断,目录大小=41,则end,否则error

:在本程序中,指定目录下的大小为41

<workflow-app xmlns='uri:oozie:workflow:0.2' name='getDirInformation'>
 
    <start to='getDirInfo' />
 
    <!-- STEP ONE -->
    <action name='getDirInfo'>
         <!--writes 2 properties: dir.num-files: returns -1 if dir doesn't exist,
             otherwise returns # of files in dir dir.modified.time: returns -1 if dir doesn't exist,
             otherwise returns modified time of dir-->
         <java>
             <job-tracker>10.1.1.26:54311</job-tracker>
             <name-node>hdfs://10.1.1.26:31054</name-node>
            <configuration>
                <property>
                    <name>mapred.queue.name</name>
                    <value>default</value>
                </property>
            </configuration>
             <main-class>myTest.oozie.GetDirInfo</main-class>
             <arg></arg>
             <capture-output />
         </java>
         <ok to="makeIngestDecision" />
         <error to="fail" />
     </action>
 
     <!-- STEP TWO -->
     <decision name="makeIngestDecision">
         <switch>
             <!-- empty or doesn't exist -->
             <case to="end">
                ${wf:actionData('getDirInfo')['dir.num-files'] eq 41}
             </case>
             <!-- # of files >= 24 -->
             <case to="fail">
              ${wf:actionData('getDirInfo')['dir.num-files'] ne 41}
             </case>
             <default to="fail"/>
         </switch>
     </decision>
 
     <kill name="fail">
          <message>num is not equal 41,Java failed, error
            message[${wf:errorMessage(wf:lastErrorNode())}]</message>
     </kill>
     <end name='end' />
</workflow-app>

 

3.编写job.properties文件

3.1命令行

可以直接编写job.properties,在命令行运行Oozie的时候指定该文件。

3.2程序调用

也可以通过程序调用OozieClient.run(jobProperties),参数为Properties

属性如下:其中具体的属性值,根据集群的配置不同而不同。



 

4.部署

将这些文件分别部署到oozie指定的HDFS路径之下

在本程序中:

 workflow.xml放入hdfs://baby6:31054/eole/user/abc/getDirInformation下;

java类打成jar包,放入hdfs://baby6:31054/eole/user/abc/lib/

5.运行

调用OozieClient.run(jobProperties),得到Oozie jobId,根据jobId,可以追踪Job的状态。

运行结果如下:



小结:在本程序中,使用oozie的java Action,并根据EL function来获取action的输出,反馈给oozie,可以用来作为判断。 

  • 大小: 31.4 KB
  • 大小: 30.1 KB
0
2
分享到:
评论

相关推荐

    Oozie之JavaAction测试实例

    JavaAction可以使用`capture-output`元素将值反向传播到Oozie上下文中,这些值随后可以通过EL函数访问。这些值需要按照Java属性格式文件输出,文件名通过`JavaMainMapper.OOZIE_JAVA_MAIN_CAPTURE_OUTPUT_FILE`常量...

    Oozie-JavaAction

    oozie 提交任务参数传递到下一个任务节点 oozie 提交任务参数传递到下一个任务节点

    Oozie安装部署及任务定义说明

    - 修改conf/oozie-env.sh,设置JAVA_HOME和其他环境变量。 - 初始化数据库,执行`oozie-setup.sh sharelib create -fs hdfs://namenode:port`创建共享库。 5. **启动Oozie服务** - 启动Oozie服务器,运行`oozie-...

    oozie介绍及使用详解

    5. **扩展性**:除了内置对Hadoop生态组件的支持,Oozie还允许用户通过编写自己的动作节点来执行自定义Java或Shell作业。 **Oozie的工作流** Oozie工作流是以XML格式定义的,称为WDL(Workflow Definition ...

    oozie配置文件

    2. **oozie-default.xml**: 这个文件包含了Oozie的所有默认配置,当oozie-site.xml不存在或未指定某个属性时,将使用这些默认值。这有助于快速设置一个基本的Oozie环境。 3. **oozie-env.sh**: 这是一个shell脚本,...

    Apache Hadoop---Oozie.docx

    3. Oozie 使用DAG(有向无环图)来组织任务,每个任务称为一个Action,多个Action按照预定顺序和依赖关系构成工作流。 4. 工作流的定义语言是HPDL,这是一种XML格式,用户可以通过HPDL来定制工作流逻辑。 5. Oozie ...

    大数据Oozie架构原理.pdf

    Oozie 是一个基于工作流引擎的开源框架,运行在 Tomcat 容器中,使用数据库存储工作流定义和实例,支持多种类型的 Hadoop 作业调度。Oozie 的架构原理可以分为四个部分:Client、Console、SDK 和 DB。 Oozie 的架构...

    尚硅谷大数据技术之Oozie1

    Oozie由Cloudera公司贡献给Apache社区,并且依赖JavaServlet容器运行。它提供了对Hadoop MapReduce、Pig等任务的调度和协调功能,特别是适合处理定时任务和多任务间的逻辑顺序。 【Oozie的功能模块】 1. **Workflow...

    工作流oozie文档

    - **工作流**:在Oozie中,工作流是由一系列的动作(Action)组成的,这些动作按照预定义的依赖关系(DAG)依次执行。只有当一个动作成功完成时,下一个动作才会被启动。 - **协调作业**:协调作业是通过设定的时间...

    oozie+spark2结合

    - 在Oozie配置中指定spark2,确保oozie.action.sharelib.for.spark属性设置为spark2。 4. 遇到的问题与解决方案 - 权限问题是一个常见的问题。Hue用户在Linux服务器上可能没有相应的用户组和用户,这会导致在YARN...

    精品课程推荐 大数据与云计算教程课件 优质大数据课程 35.Oozie(共41页).pptx

    5. **Action支持**:Oozie支持多种Action类型,包括Hadoop、Pig、SSH、HTTP、Email、Java等,并允许自定义扩展。 6. **参数化**:工作流Action可以接收参数,增强了灵活性。 **Oozie协调器**: Oozie协调器使得工作...

    oozie-impala-action

    Oozie Impala 动作 这大量借鉴了。 使用说明 命令行界面 ...$ java -jar target/oozie-impala-action-1.0-jar-with-dependencies.jar sample.sql " $CONNECTION_URL " 乌兹 参考run-oozie/workflow.xml的例子

    Hive编程指南+HIVE从入门到精通+Hive高级编程+Apache Oozie

    Hive的核心理念是将SQL语句转换为MapReduce任务进行执行,这使得非Java背景的分析师也能方便地处理大数据。Hive提供了多种组件,包括HiveQL(Hive的SQL方言)、元数据存储、查询解析器、优化器和执行器。学习Hive,...

    oozie-sqoop2

    在Java Action中调用oozie-sqoop2,意味着你可以编写Java程序,通过Oozie提供的API来启动和控制Sqoop2的操作。这在处理大数据工作流程时非常有用,因为它提供了对数据迁移任务的集中管理和监控能力。通过这种方式,...

    oozie-examples

    Apache Oozie 是一个用于管理Hadoop作业的工作流调度系统,它能够协调Hadoop生态系统中的各种组件,如Hadoop MapReduce、Pig、Hive、Sqoop、Java程序等。"oozie-examples" 提供了一系列的示例,帮助用户更好地理解和...

    工作流调度系统

    OOZIE是一个用于管理Hadoop作业的工作流调度系统,它提供了易于使用的接口来定义和执行Hadoop工作流。 Oozie系统的核心特点在于其能够顺序地运行一系列的Hadoop作业任务。这些作业被组织成有向无环图(DAG),其中...

    大数据开发指南(实际项目)

    - **2.3 编写 workflow 逻辑**:使用 Java 编写 workflow 的逻辑,包括定义各个任务之间的依赖关系等。 - **2.4 编写 workflow 测试代码**:编写测试代码以验证 workflow 的正确性。 - **2.5 编写调度配置**:定义...

    Hadoop权威指南中文版(第二版)+Hadoop in Action

    编写Java MapReduce程序,并学习如何优化性能,如使用CombineReducer和本地化数据处理。 5. **HDFS操作**:文件的创建、读取、写入、删除和重命名,以及HDFS的命令行接口。理解NameNode和DataNode的工作原理,以及...

Global site tag (gtag.js) - Google Analytics