立即注册 登录
About云-梭伦科技 返回首页

easthome001的个人空间 https://aboutyun.com/?1321 [收藏] [复制] [分享] [RSS]

日志

yarn container内存调优——什么时候container被kill

已有 1914 次阅读2017-5-4 10:23

今天散仙写了个MapReduce作业,目的是读数据库里面多个表的数据,然后在Java中根据具体的业务情况做过滤,并把符合数据的结果写入到HDFS上,在Eclipse里面提交作业进行调试的时候,发现在Reduce阶段,总是抛出Java heap space的异常,这异常明显,就是堆内存溢出造成的,然后散仙仔细看了下业务块的代码,在Reduce里读数据库的时候,有几个表的返回数据量比较大约有50万左右,因为具体的数量不会太大,所以没有采用分页来返回,读完后数据,采用Map集合封装,在业务处理的一段时间里,一直会停留在内存里,原来的mapred-site.xml里面的配置reduce内存比较小,只需调大此处内存即可。
<property>
  <name>mapreduce.map.memory.mb</name>
  <value>215</value>
</property>
<property>
  <name>mapreduce.map.java.opts</name>
  <value>-Xmx215M</value>
</property>

<property>
  <name>mapreduce.reduce.memory.mb</name>
  <value>1024</value>
</property>
<property>
  <name>mapreduce.reduce.java.opts</name>
  <value>-Xmx1024M</value>
</property>
hadoop2.2内存控制的几个重要参数:

YARN
yarn.scheduler.minimum-allocation-mb
yarn.scheduler.maximum-allocation-mb
yarn.nodemanager.vmem-pmem-ratio
yarn.nodemanager.resource.memory.mb
Mapreuce
Map Memory
mapreduce.map.java.opts
mapreduce.map.memory.mb
Reduce Memory
mapreduce.reduce.java.opts
mapreduce.reduce.memory.mb

如果出现异常:

Container [pid=17645,containerID=container_1415210272486_0013_01_000004] is running beyond physical memory limits. Current usage: 1.0 GB of 1 GB physical memory used; 1.6 GB of 2.1 GB virtual memory used. Killing container.
Dump of the process-tree for container_1415210272486_0013_01_000004 :
可以调整yarn.nodemanager.vmem-pmem-ratio 的比率,默认是2.1,或者加大程序reduce的运行个数进行尝试,这个比率的控制影响着虚拟内存的使用,当yarn计算出来的虚拟内存,比在mapred-site.xml里的mapreduce.map.memory.mb或mapreduce.reduce.memory.mb的2.1倍还要多时,就会发生上面截图中的异常,而默认的mapreduce.map.memory.mb或

mapreduce.reduce.memory.mb得初始大小为1024M,然后根据异常中的yarn自身根据运行环境推算出来的虚拟内存来做比较,发现比1024*2.1还要大,所以就会由NodeManage守护进程kill掉AM容器,从而导致整个MR作业运行失败,现在我们只需要调大这个比率即可,避免发生这种异常。具体调大多小,可根据具体情况来设置。

yarn之虚拟内存

这两天执行个wordcount或pi总是卡住或报错failed,查找了多种原因,明确了跑个job时一些参数的设置;

Job Finished in 16.602 seconds
java.io.FileNotFoundException: File does not exist: hdfs://dell:8020/user/root/QuasiMonteCarlo_1482373118226_505074045/out/reduce-out

然后我在nodemanager日志中看到:

container [pid=26086,containerID=container_1482373104195_0001_02_000001] is running beyond virtual memory limits. Current usage: 161.4 MB of 200 MB physical memory used; 879.8 MB of 420.0 MB virtual memory used. Killing container.

发现虚拟内存溢出了,所以查阅了相关资料;

一、

    yarn.nodemanager.vmem-pmem-ratio: 物理内存 与 虚拟内存的比率,每用1M物理内存,默认使用2.1M虚拟内存,(建议调大);

    或是将 yarn.nodemanager.vmem-check-enabled  虚拟内存的检查false掉,这一点很重要!











路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

关闭

推荐上一条 /2 下一条