为啥我的 Spark 运行速度比纯 Python 慢?性能比较

Posted

技术标签:

【中文标题】为啥我的 Spark 运行速度比纯 Python 慢?性能比较【英文标题】:Why does my Spark run slower than pure Python? Performance comparison为什么我的 Spark 运行速度比纯 Python 慢?性能比较 【发布时间】:2016-01-06 04:00:34 【问题描述】:

在这里激发新手。我尝试使用 Spark 对我的数据框执行一些 pandas 操作,令人惊讶的是它比纯 Python 慢(即在 Python 中使用 pandas 包)。这是我所做的:

1) 在 Spark 中:

train_df.filter(train_df.gender == '-unknown-').count()

返回结果大约需要 30 秒。但是使用 Python 大约需要 1 秒。

2) 在 Spark 中:

sqlContext.sql("SELECT gender, count(*) FROM train GROUP BY gender").show()

同样的,Spark 大约需要 30 秒,Python 大约需要 1 秒。

我的 Spark 比纯 Python 慢得多的几个可能原因:

1) 我的数据集大约有 220,000 条记录,24 MB,这不是一个足够大的数据集来显示 Spark 的扩展优势。

2) 我的 spark 在本地运行,我应该在 Amazon EC 之类的地方运行它。

3) 在本地运行是可以的,但我的计算能力并没有削减它。这是 8 Gig RAM 2015 Macbook。

4) Spark 很慢,因为我正在运行 Python。如果我使用 Scala 会好很多。 (反对意见:我听说很多人都在使用 PySpark。)

其中哪一项是最可能的原因,或者最可信的解释?我很想听听一些 Spark 专家的意见。非常感谢!!

【问题讨论】:

使用pyspark 并不是真正的问题——Spark 进程仍然是用 Scala 编写的,你如何与它交互并不影响它有一个 Java 后端这一事实。真正的问题是您的数据集/计算不够大或不够重要,无法克服使用 Spark 引入的协调开销和延迟(24 MB 数据仍处于本地计算领域)。 Spark 对于并行处理很有用,但您需要有足够的工作/计算来“吃掉” Spark 引入的开销。 【参考方案1】:

在较小的数据集上,Python 肯定会比 pyspark 表现更好。当您处理更大的数据集时,您会看到差异。

默认情况下,当您在 SQL 上下文或 Hive 上下文中运行 spark 时,它将默认使用 200 个分区。您需要使用sqlContext.sql("set spark.sql.shuffle.partitions=10"); 将其更改为 10 或任何值。它肯定会比默认更快。

1) 我的数据集大约有 220,000 条记录,24 MB,这不算大 足够的数据集来展示 Spark 的扩展优势。

您是对的,在较低的音量下您不会看到太大的差异。 Spark 也可能更慢。

2) 我的 spark 在本地运行,我应该以类似的方式运行它 而是亚马逊 EC。

对于您的音量可能没有多大帮助。

3) 本地运行没问题,但我的计算能力并没有减少 它。这是 8 Gig RAM 2015 Macbook。

同样,对于 20MB 的数据集也没有关系。

4) Spark 很慢,因为我正在运行 Python。如果我使用 Scala 它 会好很多。 (骗局:我听说很多人都在使用 PySpark 就好了。)

单独使用会有所不同。 Python 比 scala 有更多的运行时间开销,但在具有分布式能力的大型集群上,这无关紧要

【讨论】:

在 spark 1.5.2 中,sqlContext.sql("set spark.sql.shuffle.partitions=10") 在 pyspark 中崩溃。 sqlContext.setConf('spark.sql.shuffle.partitions', '10') 工作得很好。注意参数必须是字符串。 “你是对的,在较低的音量下你不会看到太大的差异” - 对于 OP 的情况,这是否可以(粗略地)量化。例如,0.1 GB、1GB、10GB、100GB、1TB,您会看到优势吗?如果有人可以指出一个可以回答的问题,那将很有帮助。 OP 报告 200k 行的速度降低了大约 30 倍。对于 100K 行(local[10] 上的 35 分钟 - 正如预期的那样 - 比 local[2]local[6] 更好),似乎我的速度可能会下降 100-1000 倍,只是为了进行逻辑回归。我已经为spark.conf.set("spark.sql.shuffle.partitions", X) 尝试了几个值。任何想法对我来说可能是什么情况? 感谢单元测试,通过将分区数设置为 1,我从 6 分钟缩短到 1 分钟。对于小型数据集,这很棒

以上是关于为啥我的 Spark 运行速度比纯 Python 慢?性能比较的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用了线程池速度没有变化呢python

Spark连接到MySQL并执行查询为啥速度会快

为啥这个算法在 python 中的运行速度比在 C++ 中快得多?

为啥此 python 代码在 pyspark 中有效,但在 spark-submit 中无效?

为啥只有一个 spark 作业只使用一个执行器运行?

为啥 spark 无法识别我的“数据框布尔表达式”?