• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

Spark中Container killed by YARN for exceeding memory limits

bigdata admin 3个月前 (04-15) 336次浏览 0个评论 扫描二维码

昨天在 yarn 集群上跑代码遇到这个问题,现在发现 spark 代码写好是重要的一方面,spark submit 参数设置也起着重要的作用

Container killed by YARN for exceeding memory limits,直白的意思就是超出内存限制了,查看 yarn 集群的设置,在 yarn 的配置表

 yarn.scheduler.maximum-allocation-mb 设置值 6114,也就是说单个 container 申请的最大内存是这么多,但是执行任务的时候你的 executer 需要的内存超出这个值,那么就会被杀掉。

在 google 一遍之后,网上给出的答案是调节参数 spark.yarn.executor.memoryOverhead,这个参数就是给 executer 预留的内存,默认情况下是

// Below calculation uses executorMemory, not memoryOverhead
math.max((MEMORY_OVERHEAD_FACTOR * executorMemory).toInt, MEMORY_OVERHEAD_MIN))

其中,MEMORY_OVERHEAD_FACTOR 默认为 0.1,executorMemory 为设置的 executor-memory, MEMORY_OVERHEAD_MIN 默认为 384m。参数 MEMORY_OVERHEAD_FACTOR 和 MEMORY_OVERHEAD_MIN 一般不能直接修改,是 Spark 代码中直接写死的。

executor-memory 计算

计算公式:

<code class="hljs fix has-numbering"><span class="hljs-attribute">  val executorMem </span>=<span class="hljs-string"> args.executorMemory + executorMemoryOverhead</span></code>

假设 executor-为 X(整数,单位为 M),即
1) 如果没有设置 spark.yarn.executor.memoryOverhead,

<code class="hljs fix has-numbering"><span class="hljs-attribute">executorMem</span>=<span class="hljs-string"> X+max(X*0.1,384)</span></code>

2)如果设置了 spark.yarn.executor.memoryOverhead(整数,单位是 M)

<code class="hljs avrasm has-numbering">executorMem=<span class="hljs-built_in">X</span> +spark<span class="hljs-preprocessor">.yarn</span><span class="hljs-preprocessor">.executor</span><span class="hljs-preprocessor">.memoryOverhead</span> </code>

需要满足的条件:

<code class="hljs avrasm has-numbering">executorMem< yarn<span class="hljs-preprocessor">.scheduler</span><span class="hljs-preprocessor">.maximum</span>-allocation-mb  </code>

说了这么一大堆,可能部分人的情况可以解决,但是博主的问题依然存在,这个时候请教了一下组内的同事,同事看了下我 spark-submit 提交的参数,让我修改了 exectute-cores 和 executer-number 以及 executer-memmory ,driver-memory,调节了以后还是炸锅了。。。那么去看了一下代码,代码目前没有任何的持久化操作,shuffle 操作以目前的数据量可以接受

解决的办法竟然是修改数据的分区数,打印了 spark 默认分配的分区数,尼玛就只有 3 个啊,我一狠心重新分配至 50 个,然后提交测试一下,然后默默的看着屏幕不算打印 INFO 信息,直至跑完。。。。。

不断学习,不断成长,感谢蒋大兄弟的帮助


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Spark 中 Container killed by YARN for exceeding memory limits
喜欢 (0)
admin
关于作者:

您必须 登录 才能发表评论!