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 请求,带上上面的配置参数,即可实现定时作业的提交。