如果我理解正确,当reduce任务开始收集其输入shuffle块(来自不同map任务的输出)时,它首先将它们保存在内存中(Q1)。在执行器的shuffle-reserved内存量用尽之前(在内存管理改变之前(Q2)),内存中的数据会被“溢写”到磁盘中。如果spark.shuffle.spill.compress为true,则该内存中的数据会以压缩方式写入磁盘。
我的问题:
Q0:我的理解正确吗?
Q1:reduce任务收集的数据是否总是未压缩的?
Q2:如何估计可用于收集shuffle块的执行器内存量?
Q3:我看到过“shuffle溢写发生在数据集无法容纳在内存中”的说法,但据我所知,只要执行器的shuffle-reserved内存足够容纳所有其活动任务的(未压缩的)shuffle输入块,就不应该发生spill,这正确吗?
如果是这样,为了避免溢写,需要确保最终进入所有并行reduce端任务的(未压缩的)数据小于执行器的shuffle-reserved内存部分吗?
我的问题:
Q0:我的理解正确吗?
Q1:reduce任务收集的数据是否总是未压缩的?
Q2:如何估计可用于收集shuffle块的执行器内存量?
Q3:我看到过“shuffle溢写发生在数据集无法容纳在内存中”的说法,但据我所知,只要执行器的shuffle-reserved内存足够容纳所有其活动任务的(未压缩的)shuffle输入块,就不应该发生spill,这正确吗?
如果是这样,为了避免溢写,需要确保最终进入所有并行reduce端任务的(未压缩的)数据小于执行器的shuffle-reserved内存部分吗?