2015-06-06 17 views
7

mam system Akka napisany w scala który trzeba zawołać jakiegoś kodu Python, powołując się na Pandas i Numpy, więc nie można po prostu użyć Jython. Zauważyłem, że Spark używa CPython na swoich węzłach roboczych, więc jestem ciekawy w jaki sposób wykonuje on kod Pythona i czy ten kod istnieje w jakiejś formie wielokrotnego użytku.Jak Spark współpracować z CPython

Odpowiedz

9

Architektura PySpark jest opisana tutaj https://cwiki.apache.org/confluence/display/SPARK/PySpark+Internals.

PySpark internals

Jak @Holden powiedział Spark wykorzystuje py4j dostęp do obiektów w Java JVM z pytona. Ale jest to tylko jeden przypadek - kiedy program sterownika jest napisany w pythonie (lewa część diagramu tam)

Drugi przypadek (prawa część diagramu) - kiedy Spark Worker uruchamia proces Pythona i wysyła serializowane obiekty Java do Pythona program do przetworzenia i otrzymuje dane wyjściowe. Obiekty Java są serializowane do formatu pikla - tak, że Python mógłby je odczytać.

Wygląda na to, czego szukasz, to ten drugi przypadek. Oto kilka linków do scala rdzenia iskra, które mogłyby być przydatne dla Ciebie, aby zacząć:

  • Pyrolite biblioteki, która zapewnia interfejs Java protokołów marynowane Pythona - używany przez Spark do serializacji obiektów Javy w formacie marynaty. Na przykład taka konwersja jest wymagana do uzyskania dostępu do części Key pary Key, Value dla PairRDD.

  • kod Scala, który uruchamia proces Python i iteracje z nim: api/python/PythonRDD.scala

  • SerDeser utils że nie zbieranie kodu: api/python/SerDeUtil.scala

  • Python uboczne: python/pyspark/worker.py

3

So Spark używa py4j do komunikacji między JVM i Python. Pozwala to Sparkowi pracować z różnymi wersjami Pythona, ale wymaga serializacji danych z JVM i vice versa w celu komunikacji. Więcej informacji na temat py4j pod numerem http://py4j.sourceforge.net/, mam nadzieję, że pomaga :)