groupby数据帧需要太多时间

时间:2018-06-19 09:31:38

标签: apache-spark dataframe group-by

我有相对大量的数据。 5000个orc文件,每个大约300 MB。和4个词典(每个几个kb)。

在数据框中加载(大约1-2小时)并加入后,我尝试对其进行分组和聚合。

tableDS
  .join(broadcast(enq1), $"url".contains($"q1"), "left_outer")
  .join(broadcast(enq2), $"url".contains($"q2"), "left_outer")
  .join(broadcast(enq3), $"url".contains($"q3"), "left_outer")
  .join(broadcast(model), $"url".contains($"model"), "left_outer")
  .groupBy($"url", $"ctn", $"timestamp")
  .agg(
collect_set(when($"q2".isNotNull && $"q3".isNotNull && $"model".isNotNull, $"model").otherwise(lit(null))).alias("model"),
collect_set(when($"q1".isNotNull && $"q2".isNotNull && $"model".isNotNull, $"model").otherwise(lit(null))).alias("model2")
  )

需要15-16个小时。

我的问题是。

1)数据帧的groupby与rdd' d(执行所有数据的shaffle)的groupbykey的工作方式是否相同,如果是的话,是否会转移到数据集方法groupbykey.reducegroupes甚至rdd reducebykey提高性能?

2)或者是资源中的问题?有200个任务正在进行分组,会增加这些任务的数量有帮助吗?我怎么会这样做?

这就是我运行它的方式

spark-submit \
--class Main \
--master yarn \
--deploy-mode client \
--num-executors 200 \
--executor-cores 20 \
--driver-memory 8G \
--executor-memory 16G \
--files hive-site.xml#hive-site.xml \
--conf spark.task.maxFailures=10 \
--conf spark.executor.memory=16G \
--conf spark.app.name=spark-job \
--conf spark.yarn.executor.memoryOverhead=4096 \
--conf spark.yarn.driver.memoryOverhead=2048 \
--conf spark.shuffle.service.enabled=true \
--conf spark.shuffle.consolidateFiles=true \
--conf spark.broadcast.compress=true \
--conf spark.shuffle.compress=true \
--conf spark.shuffle.spill.compress=true \

1 个答案:

答案 0 :(得分:0)

  

对于数据集的groupby是否与rdd'

的groupbykey相同

collect_setgroupByKey几乎相同。如果重复数量很大,它可能会表现得更好,否则您可以期望类似的性能配置文件RDD.groupByKey,而不是考虑到随机实现的差异。

  

将转移到数据集方法groupbykey.reducegroupes

不,它不会。 reduceByGroups不允许使用可变缓冲区,因此即使在最好的情况下,您也不会有很大的改进空间。

  

甚至rdd reducebykey提高了性能?

可能不是。您无法使用groupByKey改进reduceByKey(如果您相信this

  

或者是资源中的问题?有200个任务正在进行分组,会增加这些任务的数量有帮助吗?我怎么会这样做?

可能,但我们只能猜测。调整spark.sql.shuffle.partitions并自行衡量。