2016-04-21 6 views
0

Ich habe einen etwas komplexen Oozie Workflow und möchte einige der Eigenschaften an verschiedenen Stellen im Fluss sehen können. Die offensichtliche Lösung besteht darin, einfach eine Nachricht in die Protokolle zu schreiben.Ist es möglich, eine Nachricht von einem Oozie Workflow zu protokollieren, ohne sie zu löschen?

Ich bin durch die official documentation gegangen, und es scheint, dass die einzige Aktion, die Protokollierung unterstützt, ist die Aktion Kill!

Gibt es trotzdem eine Menge von Eigenschaften zu protokollieren, ohne den Workflow zu zerstören?

aktualisieren (um weitere Details zu liefern)

So vorstellen, meine (vereinfacht) Workflow sieht ungefähr so ​​aus:

<workflow-app name="myWorkflow" xmlns="uri:oozie:workflow:0.5"> 
    <start to="action1"/> 

    <kill name="Kill"> 
    <message>Failed: error ${myField}</message> 
    </kill> 

    <action name='action1'> 
    <java> 
     <job-tracker>${jobTracker}</job-tracker> 
     <name-node>${nameNode}</name-node> 
     <configuration> 
      <property> 
       <name>mapred.job.queue.name</name> 
       <value>default</value> 
      </property> 
     </configuration> 
     <main-class>my.Class</main-class> 
     <arg>${myArgument}</arg> 
     <capture-output/> 
    </java> 
    <ok to="action2" /> 
    <error to="Kill" /> 
    </action> 

    <action name='action2'> 
    <ok to="End" /> 
    <error to="Kill" /> 
    </action> 

    <end name="End"/> 
</workflow-app> 

Innerhalb des Workflow Ich habe Felder $ {myField} genannt, $ {myArgument}, $ {jobTracker} und $ {nameNode}. Einige dieser Eigenschaften sind durch den Startprozess festgelegt, andere werden von der Java-Klasse festgelegt, die ich aus 'action1' aufruft. Zwischendurch Ausführen von 'action1' und 'action2' Ich möchte die Werte dieser Felder protokollieren. Es ist mir egal, wo die Werte gespeichert sind, ich muss nur in der Lage sein zu sehen, was die Werte sind.

Ich möchte nicht meine "Kill" -Aktion aufrufen, um die Protokollierung zu tun, weil es wichtig ist, dass "action2" ausgeführt wird.

+0

Meintest du 'Nachricht' Element im Knoten' kill'? Über welche Art von Protokollen sprechen Sie und welche Eigenschaften möchten Sie drucken? – YoungHobbit

+0

@ YoungHobbit, ich habe einige weitere Details zu der Frage hinzugefügt, die das Problem in weiteren Details erklären sollte. Die kurze Antwort ist, dass ich jede Variable protokollieren möchte, die als Oozie-Ausdruck verwendet werden kann. Es ist mir egal, in welche Logs ich schreibe, nur etwas, was ich später lesen kann. – Stormcloud

+0

'$ {myField}, $ {myArgument}, $ {jobTracker} und $ {nameNode}' all dies wird in der Datei 'job.properties' definiert. Was meinst du mit 'Andere werden von der Java-Klasse gesetzt, die ich von 'action1' aus anrufe. Willst du einige Eigenschaften während einer Aktion schreiben und sie später in den folgenden Aktionen verwenden, dann ist das ein anderer Mechanismus. Ich bin mir sicher, was du hier brauchst. – YoungHobbit

Antwort

0

Eine Möglichkeit, die ich sehen konnte, ist, dass Sie ein Shell-Skript am Ende Ihres Workflows mit den Werten versehen können, die als Parameter für das Shell-Skript protokolliert werden. Schreiben Sie im Shell-Skript die Werte dieser Parameter in eine Datei und kopieren Sie die Datei in hdfs.

Sobald der Job fertig ist, können Sie den Wert dieser Eigenschaften in der Datei in hdfs überprüfen.

Hoffe, das hilft.