hadoop 伪分布式1g内存_记录配置伪分布式Hadoop环境遇到的坑

shuffle过程的输入是:map任务的输出文件,它的输出接收者是:运行reduce任务的机子上的内存

buffer,并且shuffle过程以并行方式运行

参数mapreduce.reduce.shuffle.input.buffer.percent控制运行reduce任务的机子上多少比例的

内存用作上述buffer(默认值为0.70),参数mapreduce.reduce.shuffle.parallelcopies控制

shuffle过程的并行度(默认值为5)

那么”mapreduce.reduce.shuffle.input.buffer.percent” *

“mapreduce.reduce.shuffle.parallelcopies” 必须小于等于1,否则就会出现如上错误

因此,我将mapreduce.reduce.shuffle.input.buffer.percent设置成值为0.1,

就可以正常运行了(设置成0.2,还是会抛同样的错)

另外,可以发现如果使用两个参数的默认值,那么两者乘积为3.5,大大大于1了,

为什么没有经常抛出以上的错误呢?

首先,把默认值设为比较大,主要是基于性能考虑,将它们设为比较大,可以大大加快从map复制数据的速度

其次,要抛出如上异常,还需满足另外一个条件,就是map任务的数据一下子准备好了等待shuffle去复制,

在这种情况下,就会导致shuffle过程的“线程数量”和“内存buffer使用量”都是满负荷的值,自然就造成

了内存不足的错误;而如果map任务的数据是断断续续完成的,那么没有一个时刻shuffle过程的“线程数

量”和“内存buffer使用量”是满负荷值的,自然也就不会抛出如上错误

另外,如果在设置以上参数后,还是出现错误,那么有可能是运行Reduce任务的进程的内存总量不足,可以

通过mapred.child.java.opts参数来调节,比如设置mapred.child.java.opts=-Xmx2024m

reduce会在map执行到一定比例启动多个fetch线程去拉取map的输出结果,放到reduce的内存、磁盘中,

然后进行merge。当数据量大时,拉取到内存的数据就会引起OOM,所以此时要减少fetch占内存的百分比,

将fetch的数据直接放在磁盘上。

mapreduce.reduce.shuffle.memory.limit.percent:每个fetch取到的map输出的大小能够占的内

存比的大小。默认是0.25。因此实际每个fetcher的输出能放在内存的大小是reducer的java heap

size0.90.25

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值