有没有办法在Spark中捕获执行程序被杀死的异常?

时间:2016-06-13 14:29:16

标签: apache-spark bigdata yarn

在执行我的Spark程序期间,有时(它的原因对我来说仍然是一个谜)纱线杀死容器(执行器),给出了超出内存限制的消息。虽然Spark通过生成一个新容器重新执行任务,但我的程序确实恢复了。但是,在我的程序中,任务还会在磁盘上创建一些中间文件。当一个容器被杀死时,这些文件就会被遗忘。有没有办法我可以捕获执行程序 - 作为异常被杀死,以便我可以删除留下的中间文件。显然,异常处理代码也需要在运行执行程序的同一节点上运行,这样我就可以从那里删除文件。

2 个答案:

答案 0 :(得分:5)

作为选项,您可以尝试使用SparkListener功能。 因此,您可以创建自己的类并实现SparkListener接口,以挂钩到可以自我解释的可用事件。 然后,您需要将该自定义侦听器添加到SparkContext

有两个选项:

答案 1 :(得分:4)

添加 @Taras Matyashovskyy 回答。

You can Use SparkListener and intercept SparkListener (Executor) events

以下是可用的侦听器事件列表。

  
      
  • SparkListenerApplicationStart

  •   
  • SparkListenerJobStart

  •   
  • SparkListenerStageSubmitted

  •   
  • SparkListenerTaskStart

  •   
  • SparkListenerTaskGettingResult

  •   
  • SparkListenerTaskEnd

  •   
  • SparkListenerStageCompleted

  •   
  • SparkListenerJobEnd

  •   
  • SparkListenerApplicationEnd

  •   
  • SparkListenerEnvironmentUpdate

  •   
  • SparkListenerBlockManagerAdded

  •   
  • SparkListenerBlockManagerRemoved

  •   
  • SparkListenerBlockUpdated

  •   
  • SparkListenerUnpersistRDD

  •   
  • SparkListenerExecutorAdded

  •   
  • SparkListenerExecutorRemoved

  •   

示例: HeartBeatReceiver.scala

/**
 * Lives in the driver to receive heartbeats from executors..
 */
private[spark] class HeartbeatReceiver(sc: SparkContext, clock: Clock)
  extends SparkListener with ThreadSafeRpcEndpoint with Logging {

  def this(sc: SparkContext) {
    this(sc, new SystemClock)
  }

  sc.addSparkListener(this) ...

请查看适合您的removed reason(我还没试过)