如何在Oozie中获取有关被杀工作的更具体的错误信息

时间:2012-11-23 11:29:12

标签: exception exception-handling hadoop mapreduce oozie

我有一个hadoop map-reduce作为Oozie工作流程中的一个步骤运行。 它是使用java动作启动的,它实现了org.apache.hadoop.util.Tool。

当作业因某种原因被杀死时,如果处理过程中出现异常,我希望能够通过电子邮件发送应包含堆栈跟踪的通知。

目前我这样做:

<action name="sendErrorNotifications">
    <email xmlns="uri:oozie:email-action:0.1">
        <to>some-dl@company.com</to>
        <subject>Job execution failed ${wf:id()}</subject>
        <body>Job execution failed, error message: [${wf:errorMessage(wf:lastErrorNode())}]</body>
    </email>
    <ok to="fail" />
    <error to="fail" />
</action>

但我收到的只是:

Job execution failed, error message: [Job failed!]

哪个不是很有用:)我需要自己检查所有节点的日志。

如何获取更具体的消息?我应该抓住我的异常并将其包含在工具中的一些oozie-catchable中,或者只使用一些东西而不是$ {wf:errorMessage ...

由于

2 个答案:

答案 0 :(得分:2)

一个建议是在main方法中捕获异常,并导出一个属性(例如'exceptionTrace'),异常序列化为其值(与capture-output标志结合),然后您可以使用wf:actionData('myJavaAction')['exceptionTrace'] EL功能。

http://oozie.apache.org/docs/3.2.0-incubating/WorkflowFunctionalSpec.html#a3.2.7_Java_Action

答案 1 :(得分:2)

我找到了一种方法来处理错误并使用计数器访问原因。也许这不是他们的设计目标,但它似乎是唯一的出路......

所以我在mapper和reducer中捕获每个Throwable:

} catch (Throwable t) {
    Counters.Counter counter = reporter.getCounter("Exceptions", t.getClass().getSimpleName());
        counter.increment(1);
    counter.setDisplayName(t.getClass().getSimpleName() + "\n last failed key: " + key.toString() + "\n " + ExceptionUtils.getStackTrace(t));
    reporter.incrCounter("Exceptions", "TOTAL_COUNT", 1);
    reporter.progress();
}

在作业完成后,可以通过RunningJob在工具中轻松访问这些计数器。 “例外”组包含所有例外'计数器,其中包含displayName字段中的所有必需信息。

如果您发现此方法存在任何问题或者您知道更好的问题,请发表评论。