使用大内存Map文件时内存不足

jxct1oxe  于 2021-05-30  发布在  Hadoop
关注(0)|答案(2)|浏览(648)

我正在使用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内存。这看起来很愚蠢。

clj7thdc

clj7thdc1#

请检查下面的链接,可能需要调整属性mapreduce.reduce.shuffle.input.buffer.percent
mapreduce shuffle阶段内存不足错误

yruzcnhs

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文件的实现,非堆内存需求比堆内存高,这就是为什么您必须在总内存和堆内存之间保持相当大的差距。

相关问题