【发布时间】:2019-11-07 17:37:41
【问题描述】:
举个例子:
我有一个包含 5 个节点的集群,每个节点有 64 个内核和 244 GB 内存。
我决定在每个节点上运行 3 个 executor,并设置 executor-cores 为 21,executor 内存为 80GB,这样每个 executor 可以并行执行 21 个任务。现在考虑 315(63 * 5) 个数据分区,其中 314 个分区大小为 3GB,但其中一个为 30GB(由于数据倾斜)。
所有收到 3GB 分区的 executor 有 63GB(21 * 3 = 因为每个 executor 可以并行运行 21 个任务,每个任务占用 3GB 内存空间)占用。
但是收到 30GB 分区的一个执行程序将需要 90GB(20 * 3 + 30) 内存。那么这个执行器会先执行 20 个 3GB 的任务然后加载 30GB 的任务,还是会尝试加载 21 个任务并发现对于一个任务它必须溢出到磁盘?如果我将 executor-cores 设置为 15,那么接收 30 GB 分区的 executor 将只需要 14 * 3 + 30 = 72 gb,因此不会溢出到磁盘。
那么在这种情况下,减少并行性会导致没有 shuffle 溢出吗?
【问题讨论】:
标签: apache-spark