【发布时间】:2016-10-13 10:36:35
【问题描述】:
我正在为我正在制作原型的推荐引擎改进一些 Spark 操作的性能。我偶然发现我正在使用的 DataFrame 之间存在显着的性能差异。下面是 describe() 的结果。
df1(快速,numPartitions = 4):
+-------+------------------+--------------------+
|summary| item_id| popularity|
+-------+------------------+--------------------+
| count| 187824| 187824|
| mean| 96693.34836868558| 1.0|
| stddev|55558.023793621316|5.281958866780519...|
| min| 0| 0.9999999999999998|
| max| 192806| 1.0|
+-------+------------------+--------------------+
df2(大约慢 10 倍,numPartitions = ±170):
+-------+-----------------+-----------------+
|summary| item_id| count|
+-------+-----------------+-----------------+
| count| 187824| 187824|
| mean|96693.34836868558|28.70869537439305|
| stddev|55558.02379362146|21.21976457710462|
| min| 0| 1|
| max| 192806| 482|
+-------+-----------------+-----------------+
两个 DataFrame 都已缓存,行 (187824) 和列 (2) 大小相同,并且具有相同的 item_id 列。主要区别在于第 1 帧在第二列中包含浮点数,而第 2 帧包含整数。
似乎 DataFrame 2 的每个操作都慢得多,从简单的 .describe().show() 操作到更精细的 .subtract().subtract().take()。在后一种情况下,DataFrame 2 需要 18 秒,而第 1 帧需要 2 秒(几乎慢了 10 倍!)。
我不知道从哪里开始寻找造成这种差异的原因的解释。非常感谢任何朝着正确方向的提示或轻推。
更新:正如 Viacheslav Rodionov 提出的,数据帧的分区数量似乎是 df2 性能问题的原因。
深入挖掘,这两个数据帧都是.groupBy().agg().sortBy() 对同一原始数据帧进行操作的结果。 .groupBy().agg() 操作产生 200 个分区,然后 .sortBy() 分别返回 4 和 ±170 个分区,为什么会这样?
【问题讨论】:
-
我先看看 df.rdd.getNumPartitions()
-
分区数为 174(慢)与 4(快)。感谢这个提示,我记得读过一些关于这个的东西,我会更深入地了解情况。分区数由 Spark 自动选择。尝试、错误和手动调整是解决此问题的唯一方法吗?
标签: apache-spark pyspark spark-dataframe