我试图了解 Apache PySpark 的工作原理。视频:Spark Python API - Josh Rosen 说 Python API 是 Java API 的包装器。它在内部调用 Java 方法。检查时间戳 6.41 左右
https://www.youtube.com/watch?v=mJXl7t_k0wE
本文档说 Java API 是 Scala API 的包装器
https://cwiki.apache.org/confluence/display/SPARK/Java+API+Internals
我有几个问题如下:
1) 这是否意味着 PySpark 中的每个方法(例如 map、reduce 等)都会调用 Java 中相应的方法(例如 map),然后 Java 代码将调用 Scala 中类似的方法(map)。实际执行将通过 scala 代码进行,结果将再次从 Scala -> Java -> Python 以相反的顺序返回。
2)此外,用于“map”的闭包/函数也是从 python -> java -> scala 发送的吗?
3)类RDD(对象):
"""
A Resilient Distributed Dataset (RDD), the basic abstraction in Spark.
Represents an immutable, partitioned collection of elements that can be
operated on in parallel.
"""
def __init__(self, jrdd, ctx, jrdd_deserializer=AutoBatchedSerializer(PickleSerializer())):
self._jrdd = jrdd
self.is_cached = False
self.is_checkpointed = False
self.ctx = ctx
self._jrdd_deserializer = jrdd_deserializer
self._id = jrdd.id()
self.partitioner = None
self._jrdd 是否代表该特定 RDD 的 Java 版本?
5) 我在 IntelliJ 中使用 PySpark 并已从 https://spark.apache.org/downloads.html 加载源代码.
是否可以从 PySpark 向下调试到 Scala API 以进行任何函数调用,例如“map”函数?当我尝试时,我可以看到一些与 java 相关的函数正在被调用,但之后无法在 IntelliJ Debug模式下继续。
任何帮助/解释/指示将不胜感激。
最佳答案
So does that mean for each method such as map, reduce etc. in PySpark, it will invoke corresponding methods(say map) in Java and then Java code will invoke similar methods(map) in Scala.
是和否。首先,Java 和 Scala 编译为相同的字节码 - 在执行代码时,两者都在相同的上下文中执行。 Python 有点不同——RDD 的内部机制与 JVM 语言不同,JVM 主要充当传输层,而工作代码是 Python。对于 SQL,没有工作端 Python。
Also, the closures/functions which are used for "map" are those also sent from python -> java -> scala?
序列化版本通过 JVM 发送,但执行上下文是 Python
Does self._jrdd represent Java version of that particular RDD?
是的,确实如此。
Is it possible to debug down from PySpark till Scala API for any function invocation e.g "map" function?
关于java - PySpark 是否调用 java api,然后 java api 调用 Apache Spark 中的 scala api?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46857555/