我有一个使用 scala
编写的 Akka 系统,需要调用一些依赖于 Pandas
和 Numpy
的 Python
代码,因此不能仅仅使用 Jython。我注意到 Spark 在其工作节点上使用 CPython,因此我想知道它如何执行 Python 代码以及是否存在可重用的代码。
我有一个使用 scala
编写的 Akka 系统,需要调用一些依赖于 Pandas
和 Numpy
的 Python
代码,因此不能仅仅使用 Jython。我注意到 Spark 在其工作节点上使用 CPython,因此我想知道它如何执行 Python 代码以及是否存在可重用的代码。
PySpark架构在此处描述:https://cwiki.apache.org/confluence/display/SPARK/PySpark+Internals。
正如@Holden所说,Spark使用py4j从Python访问JVM中的Java对象。但这只是一种情况-驱动程序是用python编写的(图表的左侧)
另一种情况(图表的右侧)-当Spark Worker启动Python进程并将序列化的Java对象发送到Python程序进行处理并接收输出时。 Java对象序列化为pickle格式,以便Python读取它们。
看起来您要寻找的是后一种情况。下面是一些对于您开始非常有用的Spark scala核心链接:
Pyrolite库提供了Java接口,可用于Python的pickle协议-由Spark用于将Java对象序列化为pickle格式。例如,这种转换需要访问PairRDD的Key, Value对中的键部分。
Scala代码启动Python进程并与其迭代:api/python/PythonRDD.scala
SerDeser utils将代码转换为pickle:api/python/SerDeUtil.scala
Python端代码:python/pyspark/worker.py
因此,Spark使用py4j在JVM和Python之间进行通信。这允许Spark与不同版本的Python一起工作,但需要将数据从JVM串行化并反之以进行通信。有关py4j的更多信息,请访问http://py4j.sourceforge.net/,希望这能帮到您 :)