Apache Oozie Coordinator 作业自定义配置定时任务

一,介绍

Oozie是Hadoop的工作流系统,如果使用Oozie来提交MapReduce作业(Oozie 不仅仅支持MapReduce作业,还支持其他类型的作业),可以借助Oozie Coordinator 作业来实现定时运行。

对于Oozie的作业而言,在它提交给Hadoop之前首先需要部署好。即,将配置文件(定时作业是coordinator.xml,workflow作业则是workflow.xml)、可执行的jar文件、还有待处理的输入数据上传到HDFS上。

一个典型的workflow作业的配置如下:

其中,对应的配置文件workflow.xml如下:

其中,SampleMapper 和 SampleReducer则是 将写好的MapReduce程序的Mapper类和Reducer类

然后,再在命令行使用 oozie -job ....就可以把作业提交到Hadoop运行了。

 

二,定时作业的配置及提交运行

这是本文的重点。

Oozie使用Coordinator作业来实现定时功能,对于一个定时作业,同时也需要配置文件。即:coordinator.xml。一个简单的示例如下:

frequency 、start、end  分别表示作业的运行频率、起始时间和结束时间。

这里全用变量来代替:${frequency}、${start}、${end} 这样,在提交作业时,只需要给这些变量赋值,就可以重用同一个coordinator配置文件了。

需要注意: <app-path> 可执行jar文件的路径。可以这样理解,对于一个定时作业,它本质上还是workflow作业,只不过是在workflow作业上加上了定时功能而已。因此,它需要<app-path>标签 来指明 workflow作业的部署的jar文件HDFS地址。

在每次提交作业时,只需要重新改变frequency、start、end 还有workflow 的app-path ${workflowAppUri}就可以保证基本的定时作业都使用同一个模板coordinator.xml配置文件了。

 1     public static String getXmlDataForCoordinatorFreq(String appPath, String frequency, String start, String end){
 2         StringBuilder sb = new StringBuilder();
 3         
 4         sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
 5         sb.append("<configuration>");
 6         sb.append(     "<property>");
 7         sb.append(          "<name>user.name</name>");
 8         sb.append(          "<value>" + USER_NAME + "</value>");
 9         sb.append(      "</property>");
10         sb.append(      "<property>");
11         sb.append(          "<name>jobTracker</name>");
12         sb.append(          "<value>" + JOB_TRACKER + "</value>");
13         sb.append(      "</property>");
14         sb.append(      "<property>");
15         sb.append(          "<name>nameNode</name>");
16         sb.append(          "<value>" + NAME_NODE + "</value>");
17         sb.append(      "</property>");
18         sb.append(      "<property>");
19         sb.append(           "<name>oozie.coord.application.path</name>");
20         sb.append(          "<value>" + COORDINATOR_CONFIG_FREQ + "</value>");
21         sb.append(      "</property>");
22         sb.append(      "<property>");
23         sb.append(           "<name>workflowAppUri</name>");
24         sb.append(          "<value>" + appPath + "</value>");
25         sb.append(      "</property>");
26         sb.append(      "<property>");
27         sb.append(           "<name>start</name>");
28         sb.append(          "<value>" + start + "</value>");
29         sb.append(      "</property>");
30         
31         sb.append(      "<property>");
32         sb.append(           "<name>frequency</name>");
33         sb.append(          "<value>" + frequency + "</value>");
34         sb.append(      "</property>");
35         
36         sb.append(      "<property>");
37         sb.append(           "<name>end</name>");
38         sb.append(          "<value>" + end + "</value>");
39         sb.append(      "</property>");
40         sb.append("</configuration>");
41         
42         return sb.toString();
43     }

由于Oozie支持RestClient API,提交作业。因此,通过构造 HTTP 请求,带上上面的配置参数,即可实现定时作业的提交。

 

posted @ 2016-05-30 11:19  大熊猫同学  阅读(1782)  评论(0编辑  收藏  举报