2017-03-29 1 views
6

Ich arbeite mit Jupyter-Notebooks und Python-Kernel mit einem SparkContext. Ein Kollege hat Python-Code geschrieben, der Spark-Ereignisse mit ipykernel-Ereignissen verbindet. Wenn wir sein Modul aus einer Notebook-Zelle importieren, funktioniert es in allen Kombinationen, die wir unterstützen müssen: Python 2.7 und 3.5, Spark 1.6 und 2.x, nur Linux.Ausführen von Python-Startup-Code nach dem Laden von Modulen

Jetzt möchten wir diesen Code automatisch für alle Python-Kernel aktivieren. Ich stelle den Import in unsere sitecustomize.py. Das funktioniert für Spark 2.x, aber nicht für Spark 1.6. Kernel mit Spark 1.6 erhalten keine sc mehr, und etwas ist so vermasselt, dass nicht verwandte Importe wie matplotlib.cbook fehlschlagen. Wenn ich diesen Import für ein paar Sekunden mit einem Timer verzögere, funktioniert es. Anscheinend wird der Code in sitecustomize.py zu früh ausgeführt, um das Modul zu importieren, das Spark mit dem ipykernel verbindet.

Ich bin auf der Suche nach einer Möglichkeit, diesen Import zu verzögern, bis Spark und/oder ipykernel vollständig initialisiert sind. Aber es sollte immer noch als Teil des Kernel-Starts ausgeführt werden, bevor irgendwelche Notebook-Zellen ausgeführt werden. Ich habe this trick gefunden, um die Codeausführung zu verzögern, bis sys.argv initialisiert wird. Aber ich denke nicht, dass es mit globalen Variablen wie sc funktionieren kann, wenn man bedenkt, dass Python-Globals immer noch lokal für Module sind. Das Beste, was ich bisher erreichen kann, ist die Verwendung eines Timers, um jede Sekunde zu überprüfen, ob bestimmte Module in sys.modules vorhanden sind. Aber das ist nicht sehr zuverlässig, weil ich nicht weiß, wie man ein Modul, das vollständig initialisiert ist, von einem Modul unterscheidet, das gerade geladen wird.

Irgendwelche Ideen, wie Sie Startcode einhängen, der während des Starts spät ausgeführt wird? Eine Lösung, die spezifisch für pyspark und/oder ipykernel ist, würde meine Bedürfnisse befriedigen.

+0

ich mit der Überprüfung auf das Vorhandensein von Modulen um einige mehr gespielt ... es ist nicht gut genug. Ich kann den Import zuverlässig ausführen, aber die beabsichtigte Funktionalität funktioniert möglicherweise danach nicht. Die Liste der geladenen Module zum Zeitpunkt des Imports war identisch. –

+0

Haben Sie die Umgebungsvariable 'PYTHONSTARTUP' überprüft? Von 'python --help': *' PYTHONSTARTUP': Datei beim interaktiven Start ausgeführt (kein Standardwert) * –

+0

@ piotr-dobrogost: Es handelt sich nicht um ein interaktives Startup. Wir rufen Python mit '-m ipykernel' auf, um den IPython-Kernel zu starten. –

Antwort

2

Hmmm, Sie geben nicht wirklich viele Details darüber, welche Fehler Sie begegnen.

Ich denke, die kanonische Art, das Startverhalten für den ipython-Kernel anzupassen, besteht darin, eine Konfigurationsdatei einzurichten und die Option exec_lines zu setzen.

Zum Beispiel würden Sie setzen in ~/.ipython/profile_default/ipython_config.py

# sample ipython_config.py 
c = get_config() 

c.InteractiveShellApp.exec_lines = [ 
    'import numpy', 
    'import scipy' 
] 
c.InteractiveShellApp.exec_files = [ 
    'mycode.py', 
    'fancy.ipy' 
] 
+0

Ich bekomme keine Fehlermeldung oder Log-Ausgabe oder irgendetwas. Es funktioniert einfach nicht :-(Ich schaue mir exec_lines an, danke für den Tipp. –

+0

Ich sehe, dass ipykernel auch einen Mechanismus zum Laden von Erweiterungen hat. Weiß noch nicht, ob das mein Problem löst, aber es beantwortet sicherlich meine Frage. –

Verwandte Themen