Pracuję z notebookami Jupyter i jądrami Python za pomocą SparkContext. Współpracownik napisał kod Pythona, który steruje zdarzeniami Sparka ze zdarzeniami ipykernel. Kiedy importujemy jego moduł z komórki przenośnej, działa on we wszystkich kombinacjach, które musimy obsługiwać: Python 2.7 i 3.5, Spark 1.6 i 2.x, tylko Linux.Uruchamianie kodu uruchamiania Pythona po załadowaniu modułów
Teraz chcemy włączyć ten kod automatycznie dla wszystkich rdzeni Pythona. Wpisuję import do naszego sitecustomize.py
. To działa dobrze dla Spark 2.x, ale nie dla Sparka 1.6. Jądra ze Sparkem 1.6 już nie mają numeru sc
, a coś jest tak zepsute, że nie powiodło się żadne niepowiązane importowanie, takie jak matplotlib.cbook
. Kiedy opóźniam ten import na kilka sekund przy użyciu timera, działa. Najwyraźniej kod w sitecustomize.py
jest wykonywany zbyt wcześnie, aby zaimportować moduł, który łączy Spark z ipykernel.
Szukam sposobu na opóźnienie tego importu, dopóki Spark i/lub ipykernel nie zostaną w pełni zainicjowane. Ale powinno nadal być wykonywane jako część rozruchu jądra, zanim wszystkie komórki notebooka zostaną wykonane. Znalazłem this trick, aby opóźnić wykonanie kodu do czasu zainicjowania sys.argv
. Ale nie sądzę, że może działać na zmiennych globalnych, takich jak sc
, biorąc pod uwagę, że globale Pythona są nadal lokalne dla modułów. Do tej pory najlepsze, co mogę wymyślić, to użycie timera, aby sprawdzić co sekundę, czy pewne moduły są obecne w sys.modules
. Ale to nie jest bardzo wiarygodne, ponieważ nie wiem, jak odróżnić moduł, który jest w pełni zainicjowany od tego, który jest jeszcze w trakcie ładowania.
Jakieś pomysły dotyczące przechwytywania kodu startowego, który jest uruchamiany późno podczas uruchamiania? Rozwiązanie, które jest specyficzne dla pyspark i/lub ipykernel, zaspokoiłoby moje potrzeby.
Grałem około niektóre z bardziej sprawdzanie obecności modułów ... to nie jest wystarczająco dobre. Mogę sprawić, aby import działał niezawodnie, ale zamierzona funkcjonalność może, ale nie musi, zadziałać później. Lista załadowanych modułów w czasie importu była identyczna. –
Czy sprawdziłeś zmienną środowiskową 'PYTHONSTARTUP'? From 'python --help': *' PYTHONSTARTUP': plik uruchamiany podczas interaktywnego uruchamiania (brak wartości domyślnej) * –
@ piotr-dobrogost: To nie jest interaktywny startup. Python wywołujemy za pomocą '-m ipykernel', aby uruchomić jądro IPython. –