PySpark 是不是调用 java api,然后 java api 在 Apache Spark 中调用 scala api?

Posted

技术标签:

【中文标题】PySpark 是不是调用 java api,然后 java api 在 Apache Spark 中调用 scala api?【英文标题】:Does PySpark invoke java api and in turn java api invokes scala api in Apache Spark?PySpark 是否调用 java api,然后 java api 在 Apache Spark 中调用 scala api? 【发布时间】:2017-10-20 21:25:24 【问题描述】:

我正在尝试了解 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 调试模式下继续前进。

任何帮助/解释/指针将不胜感激。

【问题讨论】:

【参考方案1】:

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

是的,不是的。首先,Java 和 Scala 编译成相同的字节码——在执行代码的那一刻,两者都在相同的上下文中执行。 Python 有点不同——RDD 的内部机制与 JVM 语言不同,JVM 主要用作传输层,工作代码是 Python。有了 SQL,就没有工作端 Python。

另外,用于“map”的闭包/函数也是从 python -> java -> scala 发送的?

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

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

是的,确实如此。

是否可以从 PySpark 到 Scala API 调试任何函数调用,例如“map”函数?

How can pyspark be called in debug mode?

【讨论】:

谢谢。欣赏它。能否请您详细说明第一个答案。我了解 Java 和 Scala API 都使用 JVM 来获取相同的字节码。但我有兴趣了解在 PySpark 中使用 map 函数时究竟会发生什么。它是先在 Java 中调用 map 函数,然后在 Scala 中调用 map 函数吗? PySpark 是否依赖于 Scala API? PySpark 的意思是 Java API 的包装器,Java API 是 Scala API 的包装器。

以上是关于PySpark 是不是调用 java api,然后 java api 在 Apache Spark 中调用 scala api?的主要内容,如果未能解决你的问题,请参考以下文章

可从 PySpark/Python 调用的 Spark(2.3+)Java 函数 [重复]

在 PySpark SQL 中并行执行读写 API 调用

pyspark:从 pyspark 调用自定义 java 函数。我需要 Java_Gateway 吗?

实现一个 java UDF 并从 pyspark 调用它

从 Scala Spark 代码调用 Pyspark 脚本

如何使用 Hive 上下文中的 Pyspark 调用用 Java 编写的 Hive UDF