【问题标题】:groupby dataframe takes too much timegroupby 数据框需要太多时间
【发布时间】:2018-11-28 05:11:02
【问题描述】:

我有相对大量的数据。 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 的 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 \

【问题讨论】:

  • 不同分区的处理时间是否可比?也许你有数据倾斜。
  • @gor 一些任务在 8 小时内完成,少数任务在 16 小时内完成。大多数需要 12-13 小时。所以它不是很倾斜。

标签: apache-spark dataframe group-by


【解决方案1】:

dataframes 的 groupby 和 rdd 的 groupbykey 一样吗

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

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

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

甚至 rdd reducebykey 提升性能?

可能不会。你将无法用reduceByKey 改进groupByKey(如果你相信this

还是资源有问题?有 200 个任务执行分组,增加这些任务的数量会有帮助吗?我该怎么做呢?

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

【讨论】:

  • 分区数增加7倍,执行时间减少约3倍/
猜你喜欢
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 2013-09-18
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
相关资源
最近更新 更多