2012-11-23 5 views
6

Ich habe einen Hadoop Map-Reduce-Job als ein Schritt in Oozie Workflow ausgeführt. Es wird mit der Java-Aktion gestartet, die org.apache.hadoop.util.Tool implementiert.Wie bekomme ich spezifischeren Fehler Informationen über Job in Oozie

Wenn der Job aus irgendeinem Grund abgebrochen wird, möchte ich in der Lage sein, eine Benachrichtigung per E-Mail zu senden, die den StackTrace enthalten sollte, wenn während der Verarbeitung eine Ausnahme aufgetreten ist.

Zur Zeit mache ich es so:

<action name="sendErrorNotifications"> 
    <email xmlns="uri:oozie:email-action:0.1"> 
     <to>[email protected]</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> 

Aber alles, was ich bekommen ist nur:

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

, die nicht sehr nützlich :) ist und ich brauche, um alle Knoten zu gehen und überprüfen Loggen von mir selbst.

Wie kann ich spezifischere Nachrichten erhalten? Soll ich meine Ausnahmen fangen und wickeln in eine Oozie-abfangbare ein im Werkzeug, oder einfach nur etwas anstelle von $ {wf: errormessage ...

Dank

Antwort

2

fand ich einen Weg, um Fehler zu handhaben und die Ursache zugreifen, indem Zähler verwenden. Vielleicht ist es nicht das, was sie für entworfen sind, aber es scheint der einzige Ausweg zu sein ...

Also ich jeden Throwable in Mapper und Minderer wie folgt zu fangen:

} 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(); 
} 

Und diese Zähler sind leicht im Tool über RunningJob zugänglich, nachdem der Job beendet ist. Die Gruppe "Ausnahmen" enthält alle Zähler der Ausnahmen mit allen erforderlichen Informationen im Feld displayName.

Bitte kommentieren Sie, wenn Sie irgendwelche Probleme in diesem Ansatz sehen oder wenn Sie den besseren kennen.

2

Ein Vorschlag ist die Ausnahme in der Haupt fangen Methode, und exportieren Sie eine Eigenschaft ('exceptionTrace' zum Beispiel) mit der Ausnahme serialisiert in ihren Wert (kombiniert mit dem Capture-Output-Flag), auf den Sie dann mit der EL-Funktion wf:actionData('myJavaAction')['exceptionTrace'] verweisen können.

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

+0

Das Problem ist, dass es im Tool nicht möglich ist, eine Ausnahme zu erfassen, die beispielsweise in Reducer aufgetreten ist. Alles, was wir dort haben, ist ein Job-Status, so dass wir nun wissen, dass etwas schief gelaufen ist ... Ich werde die Lösung anbieten, die ich als mögliche Antwort verwende. – Art