我有一个用scala
编写的Akka系统需要调用一些Python
代码,依赖于Pandas
和Numpy
,所以我无法做到只需使用Jython。我注意到Spark在其工作节点上使用CPython,所以我很好奇它是如何执行Python代码的,以及该代码是否以某种可重用的形式存在。
答案 0 :(得分:14)
此处描述了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库,为Python的pickle协议提供Java接口 - Spark使用它将Java对象序列化为pickle格式。例如,访问PairRDD的Key,Value对的Key部分需要这样的转换。
启动python进程并使用它迭代的Scala代码:api/python/PythonRDD.scala
选择代码的SerDeser工具:api/python/SerDeUtil.scala
Python方面:python/pyspark/worker.py
答案 1 :(得分:3)
所以Spark使用py4j在JVM和Python之间进行通信。这允许Spark使用不同版本的Python,但需要从JVM序列化数据,反之亦然,以进行通信。有关http://py4j.sourceforge.net/的py4j的更多信息,希望有助于:)