首页 文章

PySpark 是否会调用 Java api,而 Java api 又会在 Apache Spark 中调用 scala api?

提问于
浏览
1

我试图了解 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 内部

我有几个问题,如下所述:

  1. 这是否意味着对于 PySpark 中的 map,reduce 等每种方法,它将在 Java 中调用相应的 methods(say map),然后 Java 代码将在 Scala 中调用类似的 methods(map)。实际执行将通过 scala 代码进行,结果将再次以相反的顺序从 Scala-> Java-> Python 返回。

  2. 另外,用于“地图”的 closures/functions 也是从 python-> java-> scala 发送的吗?

  3. RDD(object 类):

"""
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 版本?

  1. 我正在 IntelliJ 中使用 PySpark,并已从https://spark.apache.org/downloads.html加载源代码。

是否可以从 PySpark 调试到 Scala API 进行任何函数调用 e.g“地图”函数的调试?当我尝试时,我可以看到一些与 Java 相关的函数正在被调用,但是之后无法在 IntelliJ 调试模式下前进。

任何 help/explanation/pointers 将不胜感激。

1 回答

  • 2

    这是否意味着对于 PySpark 中的 map,reduce 等每种方法,它将在 Java 中调用相应的 methods(say map),然后 Java 代码将在 Scala 中调用类似的 methods(map)。

    是的,没有。首先,Java 和 Scala 编译为相同的字节码-在执行代码时,两者都在同一上下文中执行。 Python 有点不同-RDD 的内部机制不同于 JVM 语言,并且 JVM 主要充当传输层,而工作代码是 Python。使用 SQL 时,没有工人端 Python。

    另外,用于“地图”的 closures/functions 也是从 python-> java-> scala 发送的吗?

    序列化版本通过 JVM 发送,但是执行上下文是 Python

    self._jrdd 是否代表该特定 RDD 的 Java 版本?

    是的,它确实。

    是否可以从 PySpark 调试到 Scala API 进行任何函数调用 e.g“地图”函数的调试?

    如何在调试模式下调用 pyspark?

相关问题