我正在使用hadoop2.4。reducer使用几个大的内存Map文件(总共大约8g)。减速机本身使用的内存非常少。据我所知,内存Map文件( FileChannel.map(readonly)
)也使用很少的内存(由os而不是jvm管理)。
我有个错误:
Container [pid=26783,containerID=container_1389136889967_0009_01_000002]
is running beyond physical memory limits.
Current usage: 4.2 GB of 4 GB physical memory used;
5.2 GB of 8.4 GB virtual memory used. Killing container
以下是我的设置:
mapreduce.reduce.java.opts=-Xmx2048m
mapreduce.reduce.memory.mb=4096
因此,我将参数调整为这个值,然后工作:
mapreduce.reduce.java.opts=-Xmx10240m
mapreduce.reduce.memory.mb=12288
我进一步调整参数,使其工作如下:
mapreduce.reduce.java.opts=-Xmx2048m
mapreduce.reduce.memory.mb=10240
我的问题是:为什么我需要yarn容器比jvm大小多8g内存?罪魁祸首似乎是我使用的大型java内存Map文件(每个大约1.5g,总计约8g)。内存Map文件不是由操作系统管理的吗?它们应该可以由多个进程共享(例如reducer)?
我使用awsm2.4xlave示例(67g内存),它有大约8g未使用的内存,操作系统应该有足够的内存。在当前设置中,每个示例只有大约5个reducer可用,每个reducer都有额外的8g内存。这看起来很愚蠢。
2条答案
按热度按时间clj7thdc1#
请检查下面的链接,可能需要调整属性mapreduce.reduce.shuffle.input.buffer.percent
mapreduce shuffle阶段内存不足错误
yruzcnhs2#
从日志来看,您似乎已经启用了
yarn.nodemanager.pmem-check-enabled
以及yarn.nodemanager.vmem-check-enabled
中的属性yarn-site.xml
. 如果启用了这些检查,则NodeManger
如果检测到容器超出了资源限制,则可能会终止容器。在您的情况下,物理内存超过了配置值(=4g),所以NodeManager
已终止任务(在容器中运行)。在正常情况下,堆内存(使用
-Xmx
中的属性mapreduce.reduce.java.opts
以及mapreduce.map.java.opts
配置)定义为总内存的75-80%(使用mapreduce.reduce.memory.mb
以及mapreduce.map.memory.mb
配置)。然而,在您的例子中,由于java内存Map文件的实现,非堆内存需求比堆内存高,这就是为什么您必须在总内存和堆内存之间保持相当大的差距。