Spark的Lost executor错误问题

Spark的Lost executor错误问题

问题一

19/06/17 09:50:52 WARN cluster.YarnSchedulerBackend$YarnSchedulerEndpoint: Requesting driver to remove executor 2 for reason Container marked as failed: container_1560518528256_0014_01_000003 on host: hadoop-master. Exit status: 143. Diagnostics: Container killed on request. Exit code is 143
Container exited with a non-zero exit code 143
Killed by external signal
19/06/17 09:50:52 ERROR cluster.YarnScheduler: Lost executor 2 on hadoop-master: Container marked as failed: container_1560518528256_0014_01_000003 on host: hadoop-master. Exit status: 143. Diagnostics: Container killed on request. Exit code is 143
Container exited with a non-zero exit code 143
Killed by external signal
19/06/17 09:50:52 WARN scheduler.TaskSetManager: Lost task 22.0 in stage 0.0 (TID 17, hadoop-master, executor 2): ExecutorLostFailure (executor 2 exited caused by one of the running tasks) Reason: Container marked as failed: container_1560518528256_0014_01_000003 on host: hadoop-master. Exit status: 143. Diagnostics: Container killed on request. Exit code is 143
 Container exited with a non-zero exit code 143
 Killed by external signal
 
 19/06/17 09:50:52 WARN scheduler.TaskSetManager: Lost task 21.0 in stage 0.0 (TID 16, hadoop-master, executor 2): ExecutorLostFailure (executor 2 exited caused by one of the running tasks) Reason: Container marked as failed: container_1560518528256_0014_01_000003 on host: hadoop-master. Exit status: 143. Diagnostics: Container killed on request. Exit code is 143
 Container exited with a non-zero exit code 143
 Killed by external signal

Spark on Yarn运行时,Yarn调度的executor资源不够,所以kill掉了executor,出现lost executor的情况。
大多是 executor-memory 或者 executor-cores 设置不合理,超过了Yarn可以调度资源的最高上限(内存或者CPU核心)。

如,3台服务器,32核心,64GB内存

yarn.scheduler.maximum-allocation-mb = 68G

设置:

num-executors = 30(一个节点上运行10个executor)
executor-memory = 6G (每个executor分配6G内存)
executor-cores = 5 (每个executor分配5个核心)

每个节点上executor占用的内存:10 * 6.5 (有512堆内内存) = 65G 没超出上限
每个节点上executor占用的核心:10 * 5 = 50 超过上限,错误

修改 executor-cores = 3 问题解决

内存设置问题同上

问题二

19/10/25 10:25:14 ERROR cluster.YarnScheduler: Lost executor 9 on cdh-master: Container killed by YARN for exceeding memory limits. 9.5 GB of 9 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead or disabling yarn.nodemanager.vmem-check-enabled because of YARN-4714.
19/10/25 10:25:14 WARN scheduler.TaskSetManager: Lost task 0.1 in stage 7.0 (TID 690, cdh-master, executor 9): ExecutorLostFailure (executor 9 exited caused by one of the running tasks) Reason: Container killed by YARN for exceeding memory limits. 9.5 GB of 9 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead or disabling yarn.nodemanager.vmem-check-enabled because of YARN-4714.

问题很明显,物理内存不够。

sudo -uhdfs spark-submit \
--class com.sm.analysis.AnalysisRetained \
--master yarn \
--deploy-mode client \
--driver-memory 3G \
--driver-cores 3 \
--num-executors 3 \
--executor-memory 8g \
--executor-cores 5 \
--jars /usr/java/jdk1.8.0_211/lib/mysql-connector-java-5.1.47.jar \
--conf spark.default.parallelism=30 \
/data4/liujinhe/tmp/original-analysis-1.0-SNAPSHOT.jar \

本来 executor 分配 8G,加上堆外内存(9 x 1024m x 0.07‬ = 645m,增量512m,所以取整1024m)1G,9G内存不够,所以加大内存为10G。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: spark.executor.memoryOverhead是Spark中的一个参数,用于控制每个Executor进程的内存使用情况。它表示Executor进程在使用内存时,需要额外预留的内存量。这个参数的默认值是executorMemory * .10,也就是Executor进程的内存总量的10%。如果Executor进程的内存使用量超过了这个值,就会触发内存溢出错误。因此,如果你的Spark应用程序需要处理大量数据,就需要根据实际情况来调整这个参数的值,以保证程序的稳定性和性能。 ### 回答2: spark.executor.memoryOverhead是spark默认配置中的一个参数,它用来控制每个executor进程额外需要的内存量,这个内存量用于非堆内存(off-heap memory)的使用,如网络缓存、JVM元数据等。 对于executor进程,它们的内存是由两个部分组成的:堆内存和非堆内存。堆内存主要用来存储业务数据和栈内存,而非堆内存则用来存储JVM元数据、线程栈、socket连接等。为了保障executor进程的正常运行,非堆内存的大小需要额外配置。 根据spark的默认配置,spark.executor.memoryOverhead的值等于executor内存的10%或384 MB(以两者中的较大者为准)。 如果executor的内存设置为2 GB,那么其memoryOverhead默认为384 MB,此时executor进程能够使用的非堆内存大小就是384 MB。如果需要调整spark.executor.memoryOverhead的大小,则需要根据实际场景进行调整。如果executor进程的非堆内存不足以支持某些非常规操作,如大规模的广播变量、多级aggregation等,则需要增加executor的memoryOverhead值。 在设置spark.executor.memoryOverhead时,需要注意两点:第一,memoryOverhead值不能超过executor内存的50%;第二,memoryOverhead过大也会影响executor进程的性能。 总的来说,spark.executor.memoryOverhead是spark中一个很重要的参数,在调优时需要结合业务场景来进行设置,以保证executor进程能够正常运行并获得最佳性能。 ### 回答3: Spark.executor.memoryOverhead是Spark作业运行过程中与内存有关的一个参数。作业执行期间会有一部分内存用来存储数据结构等信息,而executor.memoryOverhead就是用来设置这一内存的大小。 默认情况下,executor.memoryOverhead的值是executor的内存数目的10%,但这个百分比并不一定适用于所有的作业。在实际运行过程中,如果程序发生OutOfMemoryError或executor内存与操作系统进行swapping(虚拟内存),应该考虑调整executor.memoryOverhead参数的大小。通常来说,增加executor.memoryOverhead的数值可以帮助解决内存不足的问题,但同时也会影响到executor的可用内存。 调整executor.memoryOverhead的大小,需要根据具体的作业和集群来进行。一般来说,可以根据如下的步骤来设置该参数: 1. 观察Spark作业运行时的内存使用情况,如果出现OutOfMemoryError等内存不足的情况,应该考虑增加executor.memoryOverhead的数值。 2. 计算出例如下面的公式: executor.memoryOverhead = max(executor.memory * 0.1, 384MB) 这个公式是Sparkexecutor.memoryOverhead的默认值,其中max()函数所得到的结果是executor.memory的10%和384MB两个数值中的最大值。这个公式可以作为调整executor.memoryOverhead数值的参考,可以将其中的0.1和384MB根据实际情况进行调整。 3. 对于不同的作业和集群,可能需要进行不同的调整。调整executor.memoryOverhead数值的过程可能需要进行多次试验,通过观察内存使用情况来确定一个合适的数值。 总之,executor.memoryOverhead参数需要根据作业的需求和集群的配置进行适当的调整,以保证Spark作业能够正常运行,并且不出现内存不足或者过多使用内存的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值