Wie kann ich in PySpark von einer Transformation in log4j einloggen?

8

Ich möchte mich während der Umwandlung beim Logger in einem Executor anmelden, wobei Protokollstufen und Formatierung respektiert werden. Leider kann ich nicht auf das Log4j-Logger-Objekt innerhalb der Methode zugreifen, da es nicht serialisierbar ist und der Funke-Kontext innerhalb der Transformation nicht verfügbar ist. Ich könnte einfach außerhalb der Transformation alle Objekte protokollieren, die ich anfassen werde, aber das hilft nicht wirklich beim Debuggen oder Überwachen der Codeausführung.

%Vor%

Außerhalb der Transformation kann ich den Logger über:

bekommen %Vor%

Aber das sc ist aus guten Gründen in der Umwandlung nicht verfügbar. Wenn Sie versuchen, das sc direkt innerhalb der Umwandlung aufzurufen, sehen Sie die folgende Meldung:

  

Ausnahme: Es scheint, dass Sie versuchen, zu referenzieren   SparkContext von einer Broadcast-Variable, Aktion oder Transforamtion.   SparkContext kann nur für den Treiber und nicht für den ausgeführten Code verwendet werden   auf Arbeiter. Weitere Informationen finden Sie unter SPARK-5063.

Ich kann nur drucken, aber das ist nicht leicht filterbar und wird nur als unformatierte Fehlermeldung an den log4j Logger weitergeleitet.

Das Serialisieren des Loggers selbst, wie vorgesehen, schlägt fehl, wenn der Logger innerhalb der Transformationsfunktion aufgerufen wird:

%Vor%

Gibt es eine Möglichkeit, während Transformationen in pyspark auf den Executor-Logger zuzugreifen?

    
Pyrce 15.03.2016, 21:56
quelle

2 Antworten

7

Nach ein paar Stunden des Grabens in den Funkenspeicher scheint dies derzeit unmöglich zu sein. Der Executor hat eigentlich keine jvm-Instanz, an die er angehängt ist. Die Daten werden einfach über den Socket gestreamt, ohne dass eine jvm-native Bindung verwendet werden muss.

Hier ist der Worker-Erstellungscode, der die Fehlermeldungen an stderr sendet:

%Vor%

Und hier ist der worker.py-Code zum Kommunizieren der Jobverarbeitung. Es gibt keinen Platz zum Ausgeben von Protokollnachrichten oder Nachrichtentypen, die auf ein Protokollereignis hinweisen.

%Vor%

Und schließlich die verfügbaren Nachrichtentypen:

%Vor%     
Pyrce 16.03.2016, 01:53
quelle
1

Sehen Sie sich diese Frage an

Ähnliche Situation

Sie können Ihre Map-Funktion dazu bringen, ein Objekt zurückzugeben, das eine Stack-Trace-Zeichenfolge oder ein reales Objekt enthalten kann, und ein Bool-Flag, das angibt, ob ein Fehler aufgetreten ist. Dies kann nützlich sein, um eine Aufgabe zu debuggen, die Nebenwirkungen hat oder wenn bestimmte Datenbedingungen Fehler verursachen.

    
ThatDataGuy 15.11.2016 16:26
quelle

Tags und Links