2017-03-29 65 views
6

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.

+0

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. –

+0

Czy sprawdziłeś zmienną środowiskową 'PYTHONSTARTUP'? From 'python --help': *' PYTHONSTARTUP': plik uruchamiany podczas interaktywnego uruchamiania (brak wartości domyślnej) * –

+0

@ piotr-dobrogost: To nie jest interaktywny startup. Python wywołujemy za pomocą '-m ipykernel', aby uruchomić jądro IPython. –

Odpowiedz

2

Hmmm, tak naprawdę nie podaje się wielu szczegółów na temat napotkanych błędów.

Myślę, że kanonicznym sposobem na dostosowanie zachowania startowego do jądra w systemie ipython jest skonfigurowanie pliku konfiguracyjnego i ustawienie opcji exec_lines.

Na przykład będzie można umieścić w ~/.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

Nie otrzymuję komunikatu o błędzie ani wyniku dziennika lub czegokolwiek. Po prostu nie działa :-(Zajrzę do exec_lines, dziękuję za podpowiedź –

+0

Widzę, że ipykernel ma również mechanizm ładowania rozszerzeń.Nie wiem jeszcze, czy to rozwiąże mój problem, ale na pewno odpowie pytanie. –