问题描述与分析

题目中的问题大致可以描述为:

由于某个 Executor 没有按时向 Driver 发送心跳,而被 Driver 判断该 Executor 已挂掉,此时 Driver 要把 该 Executor 上执行的任务发送给另外一个 Executor 重新执行;

默认等待时长为 spark.network.timeout=120s

完整报错大概如下

17/01/13 09:13:08 WARN spark.HeartbeatReceiver: Removing executor 5 with no recent heartbeats: 161684 ms exceeds timeout 120000 ms
17/01/13 09:13:08 ERROR cluster.YarnClusterScheduler: Lost executor 5 on slave10: Executor heartbeat timed out after 161684 ms
17/01/13 09:13:08 WARN scheduler.TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, slave10): ExecutorLostFailure (executor 5 exited caused by one of the running tasks) Reason: Executor heartbeat timed out after 161684 ms
17/01/13 09:13:08 INFO scheduler.DAGScheduler: Executor lost: 5 (epoch 0)
17/01/13 09:13:08 INFO cluster.YarnClusterSchedulerBackend: Requesting to kill executor(s) 5
17/01/13 09:13:08 INFO scheduler.TaskSetManager: Starting task 0.1 in stage 0.0 (TID 5, slave06, partition 0,RACK_LOCAL, 8029 bytes)
17/01/13 09:13:08 INFO storage.BlockManagerMasterEndpoint: Trying to remove executor 5 from BlockManagerMaster.
17/01/13 09:13:08 INFO storage.BlockManagerMasterEndpoint: Removing block manager BlockManagerId(5, slave10, 34439)
17/01/13 09:13:08 INFO storage.BlockManagerMaster: Removed 5 successfully in removeExecutor
17/01/13 09:13:08 INFO scheduler.DAGScheduler: Host added was in lost list earlier: slave10
17/01/13 09:13:08 INFO yarn.ApplicationMaster$AMEndpoint: Driver requested to kill executor(s) 5.
17/01/13 09:13:08 INFO scheduler.TaskSetManager: Finished task 0.1 in stage 0.0 (TID 5) in 367 ms on slave06 (5/5)
17/01/13 09:13:08 INFO scheduler.DAGScheduler: ResultStage 0 (saveAsNewAPIHadoopFile at DataFrameFunctions.scala:55) finished in 162.495 s

Executor 没有按时向 Driver 发送心跳,原因可能为

1. 真的挂掉

2. 执行某任务由于资源不够造成死机

3. 其他原因

我们主要解决第二个

解决方案

增加资源---增加 memoryOverhead

简单来解释下

spark.yarn.executor.memoryOverhead 的内存是由 spark tungsten 自己的管理机制去管理,用的时候申请,用完释放,内存利用率高,【鉴于 JVM 的内存管理,GC 效率低,才有了这种管理机制】

而 spark.executor.memory 的内存是由 JVM 管理,分配,回收,涉及多种垃圾回收机制,用不好效率低

原因分析

如果用于存储 RDD 的空间不足,那么后存储的 RDD 的 partition 会覆盖之前的 RDD 的 partition,导致之前的 RDD 丢失,当使用丢失的 RDD partition 时,需要重新计算;

如果 java 堆或者永久代的内存不足,则会产生各种 OOM 情况,executor 会被杀死,spark 会重新申请一个 container 运行 executor,失败的 task 或者丢失的数据都会在这个 executor 上重新执行;

如果实际运行过程中,ExecutorMemory + MemoryOverhead 之和(JVM 进程总内存) 超过 container 容量,yarn 会直接杀死该 container,executor 日志中不会有记录,spark 会重新申请 container 运行 executor;

如果 java 堆以外的 JVM 进程占用内存较多,需要将 MemoryOverhead 设置足够大,否则 executor 将会被杀死

具体操作

spark.yarn.executor.memoryOverhead 的默认配置为 max(executorMemory * 0.10, 384),单位为 M

我们可以手动设置

--conf spark.yarn.executor.memoryOverhead=512

--conf spark.yarn.driver.memoryOverhead=512

减少资源占用---使用 combineByKey

如 reduceByKey,可以有效的减少内存占用

rdd.repartition(20).map(mymap).groupBy(mygroup).mapValues(len).collect()
rdd.repartition(20).map(mymap).map(mygroup).reduceByKey(lambda x, y: x+y).collect()

另外还有几种较为简单的方法

1. 增加等待时长 spark.network.timeout

2. 在资源不变的情况下,增加 executor 内存,减少 executor 数量,增加 executor cores,这个自己想想,反正就是总的不变,保证每个 task 有足够内存

参考资料:

https://blog.csdn.net/gangchengzhong/article/details/76474129

https://www.cnblogs.com/RichardYD/p/6281745.html  spark yarn任务的executor 无故 timeout之原因分析

http://f.dataguru.cn/thread-906602-1-1.html  spark.yarn.executor.memoryOverhead

spark异常篇-Removing executor 5 with no recent heartbeats: 120504 ms exceeds timeout 120000 ms 可能的解决方案的更多相关文章

  1. spark异常篇-OutOfMemory:GC overhead limit exceeded

    执行如下代码时报错 # encoding:utf-8 from pyspark import SparkConf, SparkContext from pyspark.sql import Spark ...

  2. spark异常篇-集群模式无法打印

    在集群上运行 spark 时候,对 RDD 进行 foreach(print) 并没有打印任何内容,这是怎么回事呢? 这是因为 RDD 运行在各个 worker 上,foreach 是对 各个 wor ...

  3. spark异常篇-关闭程序

    在运行 spark 程序时,出于某种原因,我想停止运行,狂按 ctrl+c 不一定起作用 以下两种情况是不好关闭的 1. cluster 运行模式 2. SparkStreaming 程序 本文旨在收 ...

  4. spark yarn任务的executor 无故 timeout之原因分析

    问题: 用  spark-submit --master yarn --deploy-mode cluster --driver-memory 2G --num-executors 6 --execu ...

  5. 异常篇—— VEH 与 SEH

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  6. 羽夏看Win系统内核——异常篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  7. Spark 核心篇-SparkContext

    本章内容: 1.功能描述 本篇文章就要根据源码分析SparkContext所做的一些事情,用过Spark的开发者都知道SparkContext是编写Spark程序用到的第一个类,足以说明SparkCo ...

  8. Spark异常:A master URL must be set in your configuration处理记录

    问题描述:    项目中一位同事提交了一部分代码,代码分为一个抽象类,里面含有sparkcontent,sparkSession对象:然后又三个子类实例化上述抽象类,这三个子类处理三个任务,最后在同一 ...

  9. 【异常】Reason: Executor heartbeat timed out after 140927 ms

    1 详细异常 ERROR scheduler.JobScheduler: Error running job streaming job ms. org.apache.spark.SparkExcep ...

随机推荐

  1. WGAN实验环境搭建

    "TensorFlow在Windows上支持Python 3.5.x和3.6.x." 因此,您无法在Windows上使用Python 2.7的tensorflow windows+ ...

  2. HTTP_POST请求的数据格式

    HTTP_POST请求的数据格式 在HTTP的请求头中,可以使用Content-type来指定不同格式的请求信息. Content-type的类型 常见的媒体格式类型:     text/html : ...

  3. mysql索引分类

    mysql索引分类 一.总结 一句话总结: 主键索引:设定为主键后数据库会自动建立索引,innodb为聚簇索引 单值索引:一个索引只包含单个列,一个表可以有多个单列索引:CREATE INDEX id ...

  4. 利用socket实现聊天-Android端核心代码

    实体类与服务端报错一致,包括包名 package loaderman.im.bean; /** * 一个聊天消息的JavaBean * * */ public class ChatMsgEntity ...

  5. JDBC的工具类

    A: 抽取两个方法,一个获取Connection对象,一个是释放资源 import java.io.FileReader; import java.sql.Connection; import jav ...

  6. Objective-C中的一些方法命名“潜规则”

    在基于Apple Xcode的Objective-C中,有一些方法命名潜规则,比如就property而言,假定你定义了如下property: @interface MyObject @property ...

  7. ubuntu Tensorflow object detection API 开发环境搭建

    https://blog.csdn.net/dy_guox/article/details/79111949 luo@luo-All-Series:~$ luo@luo-All-Series:~$ s ...

  8. node.js运行内存堆溢出的解决办法

    我是在将一组80多列13万多行的数据通过node-xlsx的时候出现的内存堆溢出的情况. 解决办法时将: node app.js 改成: node --max_old_space_size=10000 ...

  9. CSS - clearfix清除浮动

    首先,我们来解释一下为什么要使用 clearfix(清除浮动). 通常我们在写html+css的时候,如果一个父级元素内部的子元素是浮动的(float),那么常会发生父元素不能被子元素正常撑开的情况, ...

  10. 【Fiori系列】为什么SAP Fiori活的如此精致

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[Fiori系列]为什么SAP Fiori活的如 ...