6

OozieワークフローのステップとしてHadoopmap-reduceジョブを実行しています。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でキャッチ可能なものにラップするか、$ {wf:errorMessage..の代わりに何かを使用する必要があります。

ありがとう

4

2 に答える 2

2

wf:actionData('myJavaAction')['exceptionTrace']1 つの提案は、メイン メソッドで例外をキャッチし、 EL 関数を使用して参照できるように、その値にシリアル化された例外と共にプロパティ ('exceptionTrace' など) をエクスポートすることです (capture-output フラグと組み合わせます) 。

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

于 2012-11-27T11:39:43.220 に答える
2

カウンターを使用してエラーを処理し、原因にアクセスする方法を見つけました。多分それは彼らが設計されたものではないかもしれませんが、それが唯一の方法のようです...

したがって、次のように、マッパーとリデューサーですべての 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 を介してツールで簡単にアクセスできます。「Exceptions」グループには、displayName フィールドに必要なすべての情報を含むすべての例外のカウンターが含まれています。

このアプローチに問題がある場合、またはより良い方法を知っている場合はコメントしてください。

于 2012-11-28T14:19:49.340 に答える