我正在运行Hadoop作业,在我的yarn-site.xml文件中,我有以下配置:
yarn.scheduler.minimum-allocation-mb 2048 yarn.scheduler.maximum-allocation-mb 4096
但是,我偶尔会遇到以下错误:
Container [pid=63375,containerID=container_1388158490598_0001_01_000003] is running beyond physical memory limits. Current usage: 2.0 GB of 2 GB physical memory used; 2.8 GB of 4.2 GB virtual memory used. Killing container.
我发现通过增加yarn.scheduler.minimum-allocation-mb,为容器分配的物理内存会增加.但是,我并不总是希望为我的容器分配4GB,并且认为通过明确指定最大大小,我可以解决这个问题.我意识到Hadoop无法确定在映射器运行之前需要为容器分配多少内存,所以如果需要额外内存,我应该如何为容器分配更多内存?
您还应该正确配置MapReduce的内存分配.从这个HortonWorks教程:
[...]
对于我们的示例集群,我们有一个容器的最小RAM(yarn.scheduler.minimum-allocation-mb)= 2 GB.因此,我们将为Map任务容器分配4 GB,为Reduce任务容器分配8 GB.
在mapred-site.xml中:
mapreduce.map.memory.mb
:4096
mapreduce.reduce.memory.mb
:8192每个Container都将运行JVM以执行Map和Reduce任务.JVM堆大小应设置为低于上面定义的Map和Reduce内存,以便它们在YARN分配的Container内存的范围内.
在mapred-site.xml中:
mapreduce.map.java.opts
:-Xmx3072m
mapreduce.reduce.java.opts
:-Xmx6144m
上述设置配置了Map和Reduce任务将使用的物理RAM的上限.
最后,Hadoop邮件列表中此线程中的某个人遇到了同样的问题,在他们的情况下,结果发现他们的代码中存在内存泄漏.