Spark on yarn Container beyond virtual memory limits

来源:互联网 发布:平面坐标 经纬度 java 编辑:程序博客网 时间:2024/04/30 06:08

    最近在调试Spark 运行在Yarn上,但是奇怪的是我有两个不同的Yarn集群,其中一个集群中的spark能在yarn正常提交和执行任务,但是另外一个集群确不行,花了两天时间才找到问题!下面说一说问题及解决方法。

    问题描述: 我在集群1上的yarn集群提交Spark任务,任务能正常执行;在集群2上,从Yarn 的Applications列表中(http://master:8088/cluster)看,显示任务时执行成功的,没有报错,但是却不能得到处理后的结果数据。

    问题查找和分析:

    问题出在哪里呢?

    于是,我去查看Yarn的日志,找Error。奇怪,居然没有看到Error ,真是百思不得其解!于是我退而求其次,找Warning,还真有几行相关的日志,仔细一看,发现有几行日志有点可疑:

2015-09-30 02:32:08,633 INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor.ContainersMonitorImpl: Memory usage of ProcessTree 5175 for container-id container_1443526151200_0002_01_000001: 370.6 MB of 1 GB physical memory used; 2.3 GB of 2.1 GB virtual memory used2015-09-30 02:32:08,634 WARN org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor.ContainersMonitorImpl: Process tree for container: container_1443526151200_0002_01_000001 has processes older than 1 iteration running over the configured limit. Limit=2254857728, current usage = 24450129922015-09-30 02:32:08,637 WARN org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor.ContainersMonitorImpl: Container [pid=5175,containerID=container_1443526151200_0002_01_000001] is running beyond virtual memory limits. Current usage: 370.6 MB of 1 GB physical memory used; 2.3 GB of 2.1 GB virtual memory used. Killing container.


    尤其是最后一行日志中的"Killing container",问题肯定出在这里。原来是YARN的虚拟内存计算方式导致,上例中用户程序申请的内存为1Gb,YARN根据此值乘以一个比例(默认为2.1)得出申请的虚拟内存的值,当YARN计算的用户程序所需虚拟内存值大于计算出来的值时,就会报出以上错误。

   问题解决: 

     既然找到了错误,就好办了,上网一查,发现有两种方法能解决这个问题:

    1.将yarn.nodemanager.vmem-check-enabled的值改为false,即不检查VM的值;

     2.将yarn.scheduler.minimum-allocation-mb的值调高一些,默认是1024mb,或者修改yarn.nodemanager.vmem-pmem-ratio的值,默认为2.1,将该值改得更大。

   于是,我采用了第一种方法,关闭vn检查,再次提交,果然好了。终于解决了这个困扰两天的问题啦!

    


0 0