对于一些Job,可能是由于临时的环境依赖关系,导致的调度失败。
比如说调用远程的WebService接口,Restful接口等。
或者是同步远程数据发生网络异常,这种情况,应该予以自动重跑。
在Oozie下面,是支持这样的操作的:
<workflow-app xmlns="uri:oozie:workflow:0.3" name="wf-name"> <action name="a" retry-max="3" retry-interval="1"> </action>
注意,这里的schema版本是0.3
retry-max 是最大尝试的次数,但是oozie本身有个最大可尝试的限额,以oozie本身的配置为主。
另外,
retry-interval 是每次尝试间隔的时间,单位是分钟,例子上面是失败后每1分钟尝试一次。
这里甚至可以配置Error Code,就是满足一定的错误条件才会进行自动重试。这里略过。
详情:http://oozie.apache.org/docs/3.1.3-incubating/DG_WorkflowReRun.html
----------分割线-------------------
oozie 的Coordinator里面,会产生很多的Action。
这些Action的本质,其实是一个workflow。
点开这些Action,在job id 上面可以找到对应的workflow。
使用这些workflow,就可以对现有的action进行按节点重跑。
#rerun workflow 必须指定 [oozie.wf.rerun.skip.nodes (逗号分隔符) OR oozie.wf.rerun.failnodes (true或false)] oozie job -oozie http://xxxx:8080/oozie -config ./eshop_full2.properties -rerun 0000011-131209095421299-oozie-oozi-W -doas hduser -D oozie.wf.rerun.failnodes=false -D oozie.coord.application.path=
可以手工指定跳过某些节点 如:
-D oozie.wf.rerun.skip.nodes=ahhs_media_source_info,ahhs_product_info,city_info_table
Coordinator需要指定对应的oozie应用所在的hdfs路径:
oozie.coord.application.path=hdfs://127.0.0.1:9000/xxx/path/
Workflow也需要指定路径:
oozie.wf.application.path=hdfs://127.0.0.1:9000/xxx/path/
在运行job的时候,上面2个必须只能存在一个。
否则会报错:
protected static void ValidateAppPath(String wfPath, String coordPath, String bundlePath) throws XServletException {
int n = 0;
if (wfPath != null) {
n ++;
}
if (coordPath != null) {
n ++;
}
if (bundlePath != null) {
n ++;
}
if (n == 0) {
throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "a workflow, coordinator, or bundle app path is required");
}
if (n != 1) {
throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0302, "Multiple app paths specified, only one is allowed");
}
}
源码如上:
所以,需要在提交job命令的时候,对另外一个路径进行覆盖:
使用
-D <property=value> set/override value for given property
注意:
由于使用workflow的重跑机制,由Coordinator生成的参数会失效。
所以需要手工用-D 的方式手工指定日期参数或者路径参数。