我在两个不同的实例中执行了 Spark:
spark.sql.adaptive.coalescePartitions.enabled=false
spark.sql.adaptive.coalescePartitions.enabled=true
在第一个实例中,阶段图有一些重试,而另一个则没有。
你能帮我理解重试在这里意味着什么以及为什么它要执行额外的数据洗牌吗?
这里的
retry
是什么意思?
它只是表明 Spark 中的某个任务在执行过程中遇到错误,Spark 会自动重试几次然后放弃。
spark.task.maxFailures
参数进行配置,默认为4。
为什么要执行额外的数据洗牌?
现在,正如 Spark SQL 性能调优指南中提到的
spark.sql.adaptive.coalescePartitions.enabled
:
当 true 且
为 true 时,Spark 将根据目标大小(由spark.sql.adaptive.enabled
指定)合并连续的 shuffle 分区,以避免过多的小任务。spark.sql.adaptive.advisoryPartitionSizeInBytes
它暗示在您的情况下,这种优化合并没有发生,这可能会导致数据分布不均匀,增加任务失败和重试的可能性。
spark.sql.shuffle.partitions
可能会接管,默认值 200 可能不适合您的数据集。并导致数据局部性问题并最终导致您面临的问题。
retry
是什么意思?
这很可能意味着阶段内的某些任务失败,重试并成功
为什么要这样做
extra data shuffle
?
在第二个屏幕中,您有 3 个跳过的阶段
这通常意味着它们被缓存了,这就是它们没有被重新执行的原因
您在任何地方都使用
.cache
吗?