为啥我的 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 中的运行速度比在 C++ 中快得多?