gpt4 book ai didi

hadoop - Mapreduce 洗牌阶段出现内存不足错误

转载 作者:可可西里 更新时间:2023-11-01 14:09:22 27 4
gpt4 key购买 nike

我在运行wordcount-like mapreduce 程序时遇到奇怪的错误。我有一个包含 20 个从站的 hadoop 集群,每个从站有 4 GB RAM。我将 map 任务配置为具有 300MB 的堆,而我的 reduce 任务槽获得 1GB。每个节点有 2 个映射槽和 1 个缩减槽。一切顺利,直到第一轮 map task 完成。然后进度保持在100%。我想 copy phase 正在发生。每个 map task 都会生成如下内容:

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 所以关注我的第二个解决方案帖子!)在重新开始这个密集模拟之前,我会很高兴听到有人对我面临的问题的看法,因为它已经困扰了将近一个星期。我似乎也没有完全理解这个复制阶段发生了什么,我希望磁盘上的合并排序不需要太多堆大小?

非常感谢任何有用的评论和回答!

最佳答案

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

关于hadoop - Mapreduce 洗牌阶段出现内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19298357/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com