我一直想知道像Apache Spark这样支持不同语言API的系统的高级架构。例如,Spark支持Scala,Python和Java中的API。
虽然该软件是用Scala编写的,但它支持多种语言API。如何在程序化水平上完成?有人可以解释像这样的系统的高级架构吗?
答案 0 :(得分:3)
Spark使用RPC服务器将API公开给其他语言。当您查看源代码时,您会发现PySpark和SparkR中的所有对象实际上都是JVM对象包装器。请查看R DataFrame和Python DataFrame。在R中,有很多callJMethod()调用(通过某种代理调用JVM对象)。在Python中,每个对象都有一个JVM对象的句柄。在DataFrame的情况下,它是_jdf(Java DataFrame)。在引擎盖下,运行Spark(Scala实现)并运行一个RPC服务器,它将JVM对象(即SparkContext)暴露给外部进程(在本例中为PySpark和SparkR)。
问题是,如何实现在Python或R中获取代码的map()/ mapPartitions()方法?您可能知道map()方法会创建一个记住转换的RDD。为了支持Python,在Scala Spark中有一种称为PythonRDD的特殊RDD。
此外,如果您有兴趣,还有一份关于PySpark internals的文档。