6

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

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

目前我这样做:

<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...

谢谢

4

2 回答 2

2

一个建议是在您的 main 方法中捕获异常,并导出一个属性(例如“exceptionTrace”),并将异常序列化为其值(结合捕获输出标志),然后您可以使用wf:actionData('myJavaAction')['exceptionTrace']EL 函数对其进行引用。

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

于 2012-11-27T11:39:43.220 回答
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 在工具中轻松访问这些计数器。“例外”组包含所有例外的计数器,显示名称字段中包含所有需要的信息。

Please comment if you see any problems in this approach or if you know the better one.

于 2012-11-28T14:19:49.340 回答