我们在一张小桌子和一张倾斜的大桌子之间做一个简单的猪连接。"using skewed"
由于另一个错误,我们无法使用(猪倾斜连接与大表导致“拆分元数据大小超过 10000000”):(
如果我们使用默认值mapred.job.shuffle.input.buffer.percent=0.70
,我们的一些 reducer 在 shuffle 阶段会失败:
org.apache.hadoop.mapred.Task: attempt_201305151351_21567_r_000236_0 :
Map output copy failure : java.lang.OutOfMemoryError: GC overhead limit exceeded
如果我们将其更改为mapred.job.shuffle.input.buffer.percent=0.30
它可以很好地完成,尽管在 2 小时内(我们使用的 1000 个减速器中有 3 个滞后减速器),我们可以在滞后减速器日志中看到如下内容:
SpillableMemoryManager: first memory handler call-
Usage threshold init = 715849728(699072K) used = 504241680(492423K) committed = 715849728(699072K) max = 715849728(699072K)
为什么会这样?当 shuffle 输入缓冲区为 70% 时,SprilableMemoryManager 为何不能保护我们免于失败?