首页 文章

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

提问于
浏览
2

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

2 回答

  • 4

    添加 @Taras Matyashovskyy 答案 .

    You can Use SparkListener and intercept SparkListener (Executor) events .

    以下是可用的监听器事件列表 .

    SparkListenerApplicationStart SparkListenerJobStart SparkListenerStageSubmitted SparkListenerTetStartRetult SparkListenerTaskEnd SparkListenerStageCompleted SparkListenerJobEnd SparkListenerApplicationEnd SparkListenerEnvironmentUpdate SparkListenerBlockManagerAdded SparkListenerBlockManagerRemoved SparkListenerBlockUpdated SparkListenerUnpersistRDD SparkListenerExecutorAdded SparkListenerExecutorRemoved

    Example : 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(我还没试过)

  • 5

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

    有2种选择:

相关问题