yarn内存溢出的不同参数调整

yarn内存溢出的不同参数调整

shuffle

以下内容来自“董的博客”


问:
董大神,您好!在hadoop2.2也有个常见错误。输入60G的数据做waordcount(example)时,yarn在运行shuffle阶段时,container 的物理内存溢出。
后来通过调整mapreduce.reduce.java.opts=-Xmx5000m 任务才执行通过。也就是说shuffle要4G内存。
调整以下参数
mapreduce.reduce.shuffle.merge.percent=0.4
mapreduce.reduce.shuffle.parallelcopies=5
mapreduce.reduce.shuffle.input.buffer.percent=0.6
mapreduce.reduce.shuffle.memory.limit.percent=0.17
shuffle仍然要4G内存。感觉shuffle.memory.limit.percent没有起到作用。是不是bug啊?或者您碰到过嘛? 谢谢您的回复

回复:
不是bug,是你使用不当,取决于报错情况
如果是物理内存溢出,需要调整mapreduce.reduce.memory.mb参数,默认是1024
如果是虚拟内存溢出,需要调整yarn.nodemanager.vmem-pmem-ratio,默认是2.1,调大即可,或者直接不限制虚拟内存,即yarn.nodemanager.vmem-check-enabled置为false(在yarn-site.xml中,默认是true),物理内存也可以不检查,将yarn.nodemanager.pmem-check-enabled置为false(默认是true)。

问:
mapreduce.reduce.java.opts=-Xmx5000m代表reduce最大堆内存5000M,mapreduce.reduce.memory.mb要大于java.opts,代表reduce最大内存,我设置的是5120M。yarn.nodemanager.vmem-pmem-ratio用的是默认2.1。
我的意思是在shuffle阶段不该使用那么多内存。我调整shuffle参数,并没有把shuffle的内存降下来。同样的数据在1.0上shuffle内存就1G。 10个mapred并发在1.0上没问题,在2.2上直接卡住不动了,是永远不往下执行了。

回复:
shuffle不会用很多内存。另外,Hadoop 2.0中的Map Task和Reduce Task与1.0基本一致,代码基本算是重用,shuffle流程基本一致,而且wordcount这是经典的例子,通常不应该存在这种问题。能否说一下你测试的数据量和数据特征,reduce task个数,每个reduce输入数据量,每个key/value长度,我分析一下。有些极个别特性下的数据集,会出现你所说的情况,但极少碰到。

问:
单词是随机生成的,不会有问题。我跑了480个map(每个输入128m),可是reduce默认只有1个,我设置3~6个内存还是很大。有没有办法让reduce个数根据map数智能生成啊?这样应该可以减少内存。reduce是自己智能生成,而不是我人为1个个mapred设置。谢谢

回复:
调大reduce task个数,比如调整200, 一个reduce task,那台机器会爆掉的。


如果文章对您有帮助,感谢您的赞助支持!