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,可以用来作为判断。
相关推荐
JavaAction可以使用`capture-output`元素将值反向传播到Oozie上下文中,这些值随后可以通过EL函数访问。这些值需要按照Java属性格式文件输出,文件名通过`JavaMainMapper.OOZIE_JAVA_MAIN_CAPTURE_OUTPUT_FILE`常量...
oozie 提交任务参数传递到下一个任务节点 oozie 提交任务参数传递到下一个任务节点
- 修改conf/oozie-env.sh,设置JAVA_HOME和其他环境变量。 - 初始化数据库,执行`oozie-setup.sh sharelib create -fs hdfs://namenode:port`创建共享库。 5. **启动Oozie服务** - 启动Oozie服务器,运行`oozie-...
5. **扩展性**:除了内置对Hadoop生态组件的支持,Oozie还允许用户通过编写自己的动作节点来执行自定义Java或Shell作业。 **Oozie的工作流** Oozie工作流是以XML格式定义的,称为WDL(Workflow Definition ...
2. **oozie-default.xml**: 这个文件包含了Oozie的所有默认配置,当oozie-site.xml不存在或未指定某个属性时,将使用这些默认值。这有助于快速设置一个基本的Oozie环境。 3. **oozie-env.sh**: 这是一个shell脚本,...
3. Oozie 使用DAG(有向无环图)来组织任务,每个任务称为一个Action,多个Action按照预定顺序和依赖关系构成工作流。 4. 工作流的定义语言是HPDL,这是一种XML格式,用户可以通过HPDL来定制工作流逻辑。 5. Oozie ...
Oozie 是一个基于工作流引擎的开源框架,运行在 Tomcat 容器中,使用数据库存储工作流定义和实例,支持多种类型的 Hadoop 作业调度。Oozie 的架构原理可以分为四个部分:Client、Console、SDK 和 DB。 Oozie 的架构...
Oozie由Cloudera公司贡献给Apache社区,并且依赖JavaServlet容器运行。它提供了对Hadoop MapReduce、Pig等任务的调度和协调功能,特别是适合处理定时任务和多任务间的逻辑顺序。 【Oozie的功能模块】 1. **Workflow...
- **工作流**:在Oozie中,工作流是由一系列的动作(Action)组成的,这些动作按照预定义的依赖关系(DAG)依次执行。只有当一个动作成功完成时,下一个动作才会被启动。 - **协调作业**:协调作业是通过设定的时间...
- 在Oozie配置中指定spark2,确保oozie.action.sharelib.for.spark属性设置为spark2。 4. 遇到的问题与解决方案 - 权限问题是一个常见的问题。Hue用户在Linux服务器上可能没有相应的用户组和用户,这会导致在YARN...
5. **Action支持**:Oozie支持多种Action类型,包括Hadoop、Pig、SSH、HTTP、Email、Java等,并允许自定义扩展。 6. **参数化**:工作流Action可以接收参数,增强了灵活性。 **Oozie协调器**: Oozie协调器使得工作...
Oozie Impala 动作 这大量借鉴了。 使用说明 命令行界面 ...$ java -jar target/oozie-impala-action-1.0-jar-with-dependencies.jar sample.sql " $CONNECTION_URL " 乌兹 参考run-oozie/workflow.xml的例子
Hive的核心理念是将SQL语句转换为MapReduce任务进行执行,这使得非Java背景的分析师也能方便地处理大数据。Hive提供了多种组件,包括HiveQL(Hive的SQL方言)、元数据存储、查询解析器、优化器和执行器。学习Hive,...
在Java Action中调用oozie-sqoop2,意味着你可以编写Java程序,通过Oozie提供的API来启动和控制Sqoop2的操作。这在处理大数据工作流程时非常有用,因为它提供了对数据迁移任务的集中管理和监控能力。通过这种方式,...
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 编写调度配置**:定义...
编写Java MapReduce程序,并学习如何优化性能,如使用CombineReducer和本地化数据处理。 5. **HDFS操作**:文件的创建、读取、写入、删除和重命名,以及HDFS的命令行接口。理解NameNode和DataNode的工作原理,以及...