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 函数 [重复]