Container is running beyond virtual memory limits

异常显示
Container [pid=100287,containerID=container_1513249052998_0007_01_000009] is 
running beyond virtual memory limits. Current usage: 611.1 MB of 1 GB physical
memory used; 4.9 GB of 3 GB virtual memory used. Killing container.

异常分析
611.1MB: 任务所占的物理内存
1GB 是mapreduce.map.memory.mb 设置的
4.9G 是程序占用的虚拟内存: 什么是虚拟内存以及和物理内存的关系
3GB 是mapreduce.map.memory.db 乘以 yarn.nodemanager.vmem-pmem-ratio 得到的
其中yarn.nodemanager.vmem-pmem-ratio 是 虚拟内存和物理内存比例,在yarn-site.xml中设置,默认是2.1, 由于我本地设置的是3, 所以 1*3 = 3GB
很明显,container占用了4.9G的虚拟内存,但是分配给container的却只有3GB。所以kill掉了这个container
上面只是map中产生的报错,当然也有可能在reduce中报错,如果是reduce中,那么就是mapreduce.reduce.memory.db * yarn.nodemanager.vmem-pmem-ratio

解决办法:(1)修改mapred-site.xml
<property>
      <name>mapreduce.map.memory.mb</name>
<value>1536</value>
</property>
<property>
      <name>mapreduce.map.java.opts</name>
      <value>-Xmx1024M</value>
</property>
<property>
      <name>mapreduce.reduce.memory.mb</name>
      <value>3072</value>
</property>
<property>
      <name>mapreduce.reduce.java.opts</name>
      <value>-Xmx2560M</value>
</property>

解决办法:(2)修改yarn-site.xml
<property>
      <name>yarn.nodemanager.vmem-pmem-ratio</name>
      <value>2.5</value>
</property>

附录
参数名称 缺省值 说明
mapreduce.job.name
作业名称
mapreduce.job.priority NORMAL 作业优先级
yarn.app.mapreduce.am.resource.mb 1536 MR ApplicationMaster占用的内存量
yarn.app.mapreduce.am.resource.cpu-vcores 1 MR ApplicationMaster占用的虚拟CPU个数
mapreduce.am.max-attempts 2 MR ApplicationMaster最大失败尝试次数
mapreduce.map.memory.mb 1024 每个Map Task需要的内存量
mapreduce.map.cpu.vcores 1 每个Map Task需要的虚拟CPU个数
mapreduce.map.maxattempts 4 Map Task最大失败尝试次数
mapreduce.reduce.memory.mb 1024 每个Reduce Task需要的内存量
mapreduce.reduce.cpu.vcores 1 每个Reduce Task需要的虚拟CPU个数
mapreduce.reduce.maxattempts 4 Reduce Task最大失败尝试次数
mapreduce.map.speculative false 是否对Map Task启用推测执行机制
mapreduce.reduce.speculative false 是否对Reduce Task启用推测执行机制
mapreduce.job.queuename default 作业提交到的队列
mapreduce.task.io.sort.mb 100 任务内部排序缓冲区大小
mapreduce.map.sort.spill.percent 0.8 Map阶段溢写文件的阈值(排序缓冲区大小的百分比)
mapreduce.reduce.shuffle.parallelcopies 5 Reduce Task启动的并发拷贝数据的线程数目