Container killed by YARN for e

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

大家好,我是怀瑾握瑜,一只大数据萌新,家有两只吞金兽,嘉与嘉,上能code下能teach的全能奶爸

如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~


经常我们提交任务到 yarn上后出现 内存溢出的错误 类似

1
csharp复制代码ExecutorLostFailure (executor 30 exited caused by one of the running tasks) Reason: Container killed by YARN for exceeding memory limits. 40.2 GB of 40 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.

这个错误总会使你的job夭折。它的意思是:因为超出内存限制,集群停掉了,然后就会无尽的重试重试,直到彻底崩了

问题:出现以上问题原因.

数据出现了倾斜等原因导致其中一个contaimer 内存负载太大 运行失败

container 内存分配图

建议解决方式

1、增加分区数,或对分区的具体逻辑修改呢(源码)避免出现数据倾斜这个通过scala 语法进行修改

2、但是对spark sql 进行任务调度时一般难控制,可采用增加spark.yarn.executor.memoryOverhead设置为最大值,可以考虑一下4096。这个数值一般都是2的次幂

影响其几个参数:

yarn.scheduler.maximum-allocation-mb

这个参数表示每个container能够申请到的最大内存,一般是集群统一配置。Spark中的executor进程是跑在container中,所以container的最大内存会直接影响到executor的最大可用内存。当你设置一个比较大的内存时,日志中会报错,同时会打印这个参数的值。如下图 ,6144MB,即6G 本集群cm 设置100G 从前ambari 中设置10G

spark.yarn.executor.memoryOverhead

executor执行的时候,用的内存可能会超过executor-memoy,所以会为executor额外预留一部分内存。spark.yarn.executor.memoryOverhead代表了这部分内存。这个参数如果没有设置,会有一个自动计算公式(位于ClientArguments.scala中),

1
ini复制代码--conf spark.yarn.executor.memoryOverhead=4096

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

executor-memory计算

val executorMem = args.executorMemory + executorMemoryOverhead

Spark中executor-memory

程序中可以通过 –executor-memory 来设置executor执行时所需的memory

1
css复制代码--executor-memory 40G

1) 如果没有设置spark.yarn.executor.memoryOverhead,

executorMem= X+max(X*0.1,384)

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

executorMem=X +spark.yarn.executor.memoryOverhead

设置executorMem需要满足的条件:

xecutorMem< yarn.scheduler.maximum-allocation-mb


结束语

如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~

可关注公众号【怀瑾握瑜的嘉与嘉】,获取资源下载方式

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%