2016-10-24 6 views
2

TL; DRTimeout eines pyspark-Jobs

Gibt es eine Möglichkeit, einen pyspark-Job auszusetzen? Ich möchte, dass ein Funke-Job, der im Cluster-Modus läuft, automatisch beendet wird, wenn er länger als eine vorgegebene Zeit läuft.

Längere Version:

Das kryptische in the documentation aufgeführten Timeouts höchstens 120s ist, mit einer Ausnahme, die unendlich ist, aber diese wird nur verwendet, wenn spark.dynamicAllocation.enabled auf true gesetzt ist, aber standardmäßig (I haben keine Config-Parameter in diesem Cluster berührt) es ist falsch.

Ich möchte wissen, weil ich einen Code habe, der für eine bestimmte pathologische Eingabe extrem langsam laufen wird. Für die erwartete Eingabe endet der Job in weniger als einer Stunde. Das Erkennen der pathologischen Eingabe ist ebenso schwierig wie der Versuch, das Problem zu lösen, so dass ich keine clevere Vorverarbeitung durchführen kann. Die Details des Codes sind langweilig und irrelevant, also werde ich Ihnen ersparen, sie lesen zu müssen =)

Ich benutze pyspark, also wollte ich die Funktion dekorieren, die das Aufhängen verursacht, wie this, aber es scheint, dass dies Lösung funktioniert nicht im Cluster-Modus. Ich rufe meinen Spark-Code per Spark-submit von einem Bash-Skript, aber soweit ich weiß, bash "geht schlafen", während der Funke-Job läuft und nur die Kontrolle zurückbekommt, sobald der Funke-Job beendet ist, also denke ich das nicht ist eine Option.

Eigentlich könnte die Bash-Sache eine Lösung sein, wenn ich etwas cleveres tun würde, aber ich müsste die Fahrer-ID für den Job wie this bekommen, und jetzt denke ich "das ist zu viel Denken und Tippen für etwas so einfaches wie eine Auszeit, die eingebaut werden sollte. "

+0

Je mehr Details Sie die bessere Chance, teilen wir in der Lage sein, Ihnen zu helfen. –

+0

Ich möchte nur wissen, ob es irgendwo einen Konfigurationsparameter gibt, der automatisch einen Funke-Job abbricht, der im Cluster-Modus läuft, wenn er länger als eine bestimmte Zeit läuft. –

+0

Ich habe einige relevante Informationen über Dinge, die ich ausprobiert habe, hinzugefügt! –

Antwort

0

Sie können einen klassischen Python-Alarm einstellen. Dann können Sie in der Handler-Funktion Exception auslösen oder sys.exit() Funktion verwenden, um Treibercode zu beenden. Als der Fahrer fertig ist, tötet YARN die ganze Anwendung.

Sie können beispielsweise Verwendung in Dokumentation: https://docs.python.org/3/library/signal.html#example

+0

Ich kann es noch einmal versuchen. Ich habe versucht, das Beispiel hier http://stackoverflow.com/questions/2281850/timeout-function-if-it-takes-too-long-to-finish zu folgen, aber das hat nicht funktioniert. –

Verwandte Themen