17

运行类似wordcount 的mapreduce 程序时出现奇怪的错误。我有一个有 20 个从站的 hadoop 集群,每个从站有 4 GB RAM。我将 map 任务配置为 300MB 堆,reduce 任务槽获得 1GB。我每个节点有 2 个映射槽和 1 个减少槽。一切顺利,直到第一轮地图任务完成。然后进度保持在 100%。我想那时正在复制阶段。每个地图任务都会生成如下内容:

Map output bytes    4,164,335,564
Map output materialized bytes   608,800,675

(我正在使用 SnappyCodec 进行压缩)

停止大约一个小时后,reduce 任务崩溃,但有以下异常:

    Error: java.lang.OutOfMemoryError: Java heap space at  
org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.shuffleInMemory(ReduceTask.java:1703) at
org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.getMapOutput(ReduceTask.java:1563) at
org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.copyOutput(ReduceTask.java:1401) at
org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.run(ReduceTask.java:1333

我在谷歌上搜索并找到了这个链接,但我真的不知道该怎么做: hadoop common link

我不明白如果 hadoop 能够执行 terasort 基准测试,为什么它会在复制和合并时遇到任何问题。不可能所有的 map 输出都应该适合 reducer 线程的 RAM。那么这里发生了什么?

在上面提供的链接中,他们讨论了调整以下参数:

mapreduce.reduce.shuffle.input.buffer.percent = 0.7
mapreduce.reduce.shuffle.memory.limit.percent = 0.25
mapreduce.reduce.shuffle.parallelcopies = 5

他们声称参数的乘积大于 1 的事实允许堆大小错误。编辑:请注意 5*1.25*0.7 仍然 <1,所以请关注我的第二个解决方案帖子!)在重新开始这个密集的模拟之前,我很高兴听到有人对我面临的问题的看法,因为它几乎困扰了现在一周。我似乎也不完全理解这个复制阶段发生了什么,我希望磁盘上的合并排序不需要太多堆大小?

非常感谢您提供任何有用的评论和答案!

4

4 回答 4

17

我认为线索是减少阶段几乎完全需要我的减少任务的堆大小。但是洗牌阶段正在争夺同一个堆空间,由此产生的冲突导致我的工作崩溃。我认为这解释了为什么如果我降低shuffle.input.buffer.percent.

于 2013-11-26T15:32:01.847 回答
9

您引用的参数mapred.job.shuffle.input.buffer.percent显然是 Hadoop 2 之前的参数。我可以根据1.04 文档在 mapred-default.xml 中找到该参数,但它的名称已更改为mapreduce.reduce.shuffle.input.buffer.percent根据2.2.0 文档

根据文档,此参数的描述是:

在 shuffle 期间从最大堆大小分配到存储映射输出的内存百分比。

有关 Sort 和 Shuffle 的完整理解,请参阅The Hadoop Definitive Guide 的第 6.4 章。那本书提供了参数的替代定义mapred.job.shuffle.input.buffer.percent

在 shuffle 的复制阶段分配给映射输出缓冲区的总堆大小的比例。

mapred.job.shuffle.input.buffer.percent由于您观察到从它的默认值中减小值0.70.2解决您的问题,因此可以非常肯定地说,您也可以通过增加减速器堆大小的值来解决您的问题。

于 2014-11-05T06:13:03.763 回答
3

即使将其更改shuffle.input.buffer.percent为 0.2 后,它对我也不起作用并且出现相同的错误。

在单节点集群上进行命中和试验后,我发现/目录中需要有足够的空间,因为进程会使用该空间以防溢出。

溢出目录也需要更改。

于 2015-04-13T12:17:21.457 回答
1

相关错误 - https://issues.apache.org/jira/browse/MAPREDUCE-6724

如果计算出的 maxSingleShuffleLimit > MAX_INT 会导致 NegativeArraySizeException

于 2017-06-07T17:14:31.747 回答