【问题标题】:PySpark vs Scala Spark vs Spark SQL - Which one is performance efficient? Are UDFs still bad?PySpark vs Scala Spark vs Spark SQL - 哪一个是性能高效的? UDF 仍然很糟糕吗?
【发布时间】:2022-10-17 11:58:39
【问题描述】:
我一直在阅读很多博客,试图了解 PySpark、ScalaSpark 和 Spark SQL 中哪些在性能方面是高效的。以前,我知道 ScalaSpark 更好,因为 Spark 在 JVM 中运行,并且 Python<->JVM 数据序列化/反序列化的开销会降低 Python 的效率。这还成立吗?
Scala UDF 可以创建吗?还是它们的性能效率不高,因为它不能被 Tungsten 处理。
另外,光子引擎在这些方面如何发挥作用?
我知道有人问过其中一些问题,但就像 5 年前一样,现在 Spark 世界发生了很多变化。
【问题讨论】:
标签:
scala
apache-spark
pyspark
apache-spark-sql
databricks
【解决方案1】:
scala 中的PySpark 和spark 使用Spark SQL 优化。理论上它们具有相同的性能。 UDF 内部存在差异。这里,PySpark 缺少强类型,这反过来又不允许 Spark SQL 引擎针对类型进行优化。然而,pandas UDFs 也有一个解决方案。它们允许类型信息,并且 spark 引擎可以使用 pandas 类型优化处理逻辑,就像在 scala 或 java 中一样。
【解决方案2】:
在浏览了多个博客以了解 Spark 的工作原理并尝试了一些东西之后,我现在对 Spark 平台有了更好的了解。
因此,Spark 使用 JVM 来运行转换,这意味着 Scala 和 Java 是 Spark 环境中的一等公民。它们通常具有更高的效率。 PySpark 是通过运行一个与 JVM 通信的 python 进程来完成的,这使得它有一点点开销。但是 PySpark 仍然只是在 JVM 中运行的 Spark API 的一个包装器,这意味着执行时间的差异接近于零。
只要数据保留在 JVM 中(通过使用 PySpark API),就没有性能问题。但是当我们使用普通的 Python UDF 时,数据会在 JVM 和 Python 进程(序列化/反序列化)之间传输,从而导致巨大的性能差距。
与使用 Apache Arrow 优化数据传输过程的 Python UDF 相比,Pandas UDF 是更好的选择,对于 Databricks,Pyspark。但这再次导致数据在 Python 进程和 JVM 之间移动。因此,尽可能避免 UDF 是最好的方法。
如果无法避免,Scala UDF > Pandas UDF > Python UDF。