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
Architektura PySpark jest opisana tutaj https://cwiki.apache.org/confluence/display/SPARK/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
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 :)