Notebooki w Data Science. Jupyter czy Apache Zeppelin?
Pracując nad analizą danych, potrzebujemy narzędzi, które pozwolą zwizualizować je oraz sprawnie operować wieloma zmiennymi. Co więc powinniśmy wybrać: arkusz kalkulacyjny, odpowiednie IDE (np. RStudio lub Spyder), a może któryś z notebooków? Przyjrzyjmy się uważniej temu ostatniemu rozwiązaniu. Każdy, kto z nich korzystał wie, jak przydatnym są te środowiska, pozwalają bowiem na wykonywanie fragmentów kodu w komórkach notatnika oraz zapisanie wyników obliczeń czy wizualizacji danych. Dzięki temu całość znajduje się w jednym pliku i możemy łatwo prześledzić cały proces.
Krzysztof Joachimiak. Machine Learning Engineer i Software Developer w StethoMe®. Zaczynał jako Android Developer, po czym przeskoczył do swojej ulubionej działki IT, czyli uczenia maszynowego. Stara się trzymać rękę na pulsie jeśli chodzi o rozwój tak zwanej – nieraz trochę na wyrost — sztucznej inteligencji. Ostatnio związany z poznańskim startupem z branży medycznej, StethoMe®.
Jupyter Notebook z kernelem do Pythona 2
Spis treści
Jupyter Notebook
Bez wątpienia najpopularniejszy z obecnie wykorzystywanych notebooków, to Jupyter Notebook. Projekt wyewoluował ze środowiska IPython, jednak obecnie w Jupyterze możemy korzystać nie tylko z języka oprogramowania z wężem w nazwie. Znajdziemy szereg tzw. kerneli, które pozwolą uruchomić nam notatnik z użyciem chociażby R, Scali czy Julii. Polecam wszystkim zapoznać się z tą listą (są tam nie tylko języki skryptowe, jest tam też np. kenel do C++).
Jupyter nie jest jednak bez wad. Jako pierwszą należy przede wszystkim wymienić wersjonowanie. Plik .ipynb w surowej formie jest zdecydowanie mniej czytelny, niż skrypt w Pythonie czy jakimkolwiek innym języku.
Z tego powodu wielu użytkowników za dobrą praktykę uważa generowanie plików .html oraz .py (jeśli, rzecz jasna używamy Pythona). Możemy to zrobić w prosty sposób używając narzędzia nbconvert.
jupyter nbconvert –to=”python”
Bardzo pożyteczne może okazać się również narzędzie nbdime, które ułatwia porównywanie oraz merge’owanie notebooków. Warto tu wspomnieć przede wszystkim o komendach nbdiff-web oraz nbdiff-merge. Ich użycie spowoduje, że wykonywana przez nas operacja zostanie czytelnie zwizualizowana w przeglądarce internetowej.
Przykład użycia nbdiff-web
W codziennym użytkowaniu notebooków problemem może być odnalezienie się w kolejności wykonywania operacji. Intuicyjnie będziemy przecież czytać nasz notatnik z góry na dół, ale przez to możemy trafić na wiele niespodzianek. Komórki w notebooku mogą przecież być uruchamiane w dowolnej kolejności.
Coś Wam tutaj nie gra?
W takiej sytuacji pewnie spróbujemy się poratować jupyterowym “magikiem” %history, dzięki któremu uzyskamy wgląd do kolejności wykonania komórek.
Jeśli chcecie jeszcze bardziej skomplikować sobie życie, użyjcie JupyterLab wraz z jego możliwością współdzielenia stanu komórki między wieloma notebookami. Tę opowieść można by ciągnąć w nieskończoność, ponieważ każdy znajdzie coś, co czego mu w Jupyetrze brakuje. Proponuję wtedy przejrzeć listę rozszerzeń notebooka.
Apache Zeppelin
Warto dać szansę notebookom Apache Zeppelin przede wszystkim wtedy, jeśli zależy nam na dobrej integracji z narzędziami przeznaczonymi do przetwarzania dużych zbiorów danych takimi jak np. Hadoop czy Spark.
Flink, Casandra, Elasticsearch… Lista silników Apache Zeppelin jest naprawdę bardzo ciekawa, jeśli pracujemy z Big Data
Do jednego notebooka możemy podłączyć kilka silników naraz, a następnie uruchamiać w osobnych paragrafach, jak nazywają się komórki w Zeppelinie.
Tutorial dla języka Scala, w którym możemy użyć Pythona
Spytacie pewnie, czy da się w takim razie przekazywać sobie obiekty między jednym a drugim językiem/środowiskiem. Tak, jest to możliwe dzięki wykorzystaniu ZeppelinContext.
%spark val myObject = ... z.put("objName", myObject) %spark.pyspark myObject = z.get("objName")
Bardzo ciekawie przedstawia się w tym notebooku również kwestia wykonywania zapytań do baz danych.
Dane uzyskane przez wykonanie zapytania np. języku SQL czy HiveQL można przejrzeć w formie surowej tabeli, bądź pod postacią któregoś z automatycznie wygenerowanych wykresów. Nie musimy do tego dodawać ani jednej linijki kodu, gdyż jest to oferowane przez sam notatnik.
Wykresy “robią się same”
Niestety, używając Apache Zeppelin będziemy borykać się również z tymi samymi bolączkami, które napotykamy w Jupyterze — chodzi mi tu konkretnie o wersjonowanie i kolejność wykonania kodu.
Jakbyśmy to już gdzieś widzieli
Dodatkowo, możemy mieć problem z wyświetlaniem notatników w miejscach, w których przywykliśmy bez problemu otwierać pliki .ipynb. Przykładowo, nie podejrzymy sobie notebooka na GitHubie bez sięgania po zewnętrzne narzędzia (patrz np.: Zepl). Warto podkreślić, że działający serwis Zeppelina zgodnie ze swoim designem wspiera jednoczesne używanie tego samego notatnika przez wielu użytkowników.
Podsumowanie
Oba notatniki są bardzo wygodnym narzędziem do pracy z danymi, przy czym Jupyter lepiej sprawdzi się w pracy z mniejszymi datasetami, które da się załadować do pamięci komputera. Apache Zeppelin nada się natomiast wyśmienicie do operowania na naprawdę dużych zbiorach danych, przy których musimy używać dział nieco cięższego kalibru jak Hadoop. Nie możemy jednak zapominać, że oba rozwiązania cierpią też na podobne problemy, zwłaszcza związane z wersjonowaniem kodu oraz nieintuicyjnym działaniem.
Zdjęcie główne artykułu pochodzi z pexels.com.