我有相对大量的数据。 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 \
答案 0 :(得分:0)
对于数据集的groupby是否与rdd'
的groupbykey相同
collect_set
与groupByKey
几乎相同。如果重复数量很大,它可能会表现得更好,否则您可以期望类似的性能配置文件RDD.groupByKey
,而不是考虑到随机实现的差异。
将转移到数据集方法groupbykey.reducegroupes
不,它不会。 reduceByGroups
不允许使用可变缓冲区,因此即使在最好的情况下,您也不会有很大的改进空间。
甚至rdd reducebykey提高了性能?
可能不是。您无法使用groupByKey
改进reduceByKey
(如果您相信this)
或者是资源中的问题?有200个任务正在进行分组,会增加这些任务的数量有帮助吗?我怎么会这样做?
可能,但我们只能猜测。调整spark.sql.shuffle.partitions
并自行衡量。