考虑一个示例:
我有一个包含5个节点的群集,每个节点具有64个核心,并具有244 GB内存。
我决定在每个节点上运行3个执行程序,并将执行程序核心数设置为21,执行程序内存为80GB,以便每个执行程序可以并行执行21个任务。现在考虑315(63 * 5)个数据分区,其中314个分区的大小为3GB,但其中一个分区为30GB(由于数据偏斜)。
接收到3GB分区的所有执行器都具有63GB(21 * 3 =,因为每个执行器可以并行运行21个任务,每个任务占用3GB的内存空间)。
但是接收到30GB分区的一位执行者将需要90GB(20 * 3 + 30)内存。那么,这个执行器会先执行20个3GB的任务,然后再加载30GB的任务,还是只是尝试加载21个任务并发现它不得不溢出到磁盘上呢?如果我将executor-cores设置为15,那么接收30 GB分区的executor将只需要14 * 3 + 30 = 72 gb,因此不会溢出到磁盘上。
那么在这种情况下,并行度的降低是否会导致无随机播放溢出?