一,介绍
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(" "); 5 sb.append(""); 6 sb.append( " ");41 42 return sb.toString();43 }"); 7 sb.append( " ");10 sb.append( "user.name "); 8 sb.append( "" + USER_NAME + " "); 9 sb.append( "");11 sb.append( " ");14 sb.append( "jobTracker ");12 sb.append( "" + JOB_TRACKER + " ");13 sb.append( "");15 sb.append( " ");18 sb.append( "nameNode ");16 sb.append( "" + NAME_NODE + " ");17 sb.append( "");19 sb.append( " ");22 sb.append( "oozie.coord.application.path ");20 sb.append( "" + COORDINATOR_CONFIG_FREQ + " ");21 sb.append( "");23 sb.append( " ");26 sb.append( "workflowAppUri ");24 sb.append( "" + appPath + " ");25 sb.append( "");27 sb.append( " ");30 31 sb.append( "start ");28 sb.append( "" + start + " ");29 sb.append( "");32 sb.append( " ");35 36 sb.append( "frequency ");33 sb.append( "" + frequency + " ");34 sb.append( "");37 sb.append( " ");40 sb.append("end ");38 sb.append( "" + end + " ");39 sb.append( "
由于Oozie支持RestClient API,提交作业。因此,通过构造 HTTP 请求,带上上面的配置参数,即可实现定时作业的提交。