在oozie的运行过程当中可能会出现错误,比如数据库连接不上,或者作业执行报错导致流程进入suspend或者killed状态,这个时候我们就要分析了,如果确实是数据或者是网络有问题,我们比如把问题解决了才可以重新运行作业。重新运行作业分两种情况,suspend状态和killed状态的,这两种状态是要通过不同的处理方式来处理的。
(1)suspend状态的我们可以用resume方式来在挂起的地方恢复作业,重新运行,或者是先杀掉它,让它进入killed状态,再进行重新运行。
public static void resumeJob(String jobId) { try { OozieClient wc = new OozieClient("http://192.168.1.133:11000/oozie"); wc.resume(jobId); } catch (OozieClientException e) { log.error(e); } } public static void killJob(String jobId) { try { OozieClient wc = new OozieClient("http://192.168.1.133:11000/oozie"); wc.kill(jobId); } catch (OozieClientException e) { log.error(e); } }
(2)killed状态的重新运行方法和它不一样,下面先贴出代码。
public static void reRunJob(String jobId, Properties conf) { OozieClient wc = new OozieClient("http://192.168.1.133:11000/oozie"); try { Properties properties = wc.createConfiguration(); properties.setProperty("nameNode", "hdfs://192.168.1.133:9000"); properties.setProperty("queueName", "default"); properties.setProperty("examplesRoot", "examples"); properties .setProperty("oozie.wf.application.path", "${nameNode}/user/cenyuhai/${examplesRoot}/apps/map-reduce"); properties.setProperty("outputDir", "map-reduce"); properties.setProperty("jobTracker", "http://192.168.1.133:9001"); properties.setProperty("inputDir", "/user/cenyuhai/examples/input-data/text"); properties.setProperty("outputDir", "/user/cenyuhai/examples/output-data/map-reduce"); properties.setProperty("oozie.wf.rerun.failnodes", "true"); //这两个参数只能选一个,第一个是重新运行失败的节点,第二个是需要跳过的节点 // properties.setProperty("oozie.wf.rerun.skip.nodes", ":start:"); wc.reRun(jobId, properties); } catch (OozieClientException e) { log.error(e); } }
好,现在开始讲解,重新运行作业,除了需要原有流程的id之外,还需要重新配置作业属性,它可以和原来的属性不一样,这里面有两个属性是必须要注意的,它们是重新提交作业必须具备的属性,如果不存在就会报错的,它们分别是oozie.wf.rerun.failnodes和oozie.wf.rerun.skip.nodes。这两个必须必须存在一个,第一个是自动运行失败的流程节点,第二个是需要跳过的节点,通过设置这个属性的话,如果已经运行成功的节点不在这个属性里面的话就可以让已经运行成功的节点再运行一遍了,爽吧!
好啦,就到这吧,oozie貌似就这么多东西了,目前貌似一直都没有看到它的事务机制,它的定时作业不太想研究,看着就费劲儿,还不如自己写一个定时作业呢。。。