【问题标题】:Is there a way to catch executor killed exception in Spark?有没有办法在 Spark 中捕获执行者被杀死的异常?
【发布时间】:2016-10-14 00:39:36
【问题描述】:

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

【问题讨论】:

    标签: apache-spark bigdata hadoop-yarn


    【解决方案1】:

    添加在 @Taras Matyashovskyy 答案之上。

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

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

    • SparkListenerApplicationStart

    • SparkListenerJobStart

    • SparkListenerStageSubmitted

    • SparkListenerTaskStart

    • SparkListenerTaskGettingResult

    • SparkListenerTaskEnd

    • SparkListenerStageCompleted

    • SparkListenerJobEnd

    • SparkListenerApplicationEnd

    • SparkListenerEnvironmentUpdate

    • 已添加 SparkListenerBlockManager

    • SparkListenerBlockManagerRemoved

    • SparkListenerBlockUpdated

    • SparkListenerUnpersistRDD

    • 已添加 SparkListenerExecutor

    • 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,这可能适合你(我没试过)

    【讨论】:

    • 我明白了。但是 SparkListener 必须在驱动节点上执行,那么如何从被杀死的执行程序执行的节点中杀死文件?
    • 驱动程序必须在其整个生命周期内侦听并接受来自其执行程序的传入连接(例如,请参阅网络配置部分中的 spark.driver.port 和 spark.fileserver.port)。因此,驱动程序必须可从工作节点进行网络寻址。 spark.apache.org/docs/latest/cluster-overview.html
    • 请以此类 HeartbeatReceiver.scala 为例,github.com/apache/spark/blob/… 也在答案中更新
    【解决方案2】:

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

    有2个选项可供选择:

    【讨论】:

    • 感谢您的回答。但似乎 SparkListener 在驱动程序节点上执行。那么,如何从被杀死的执行者正在执行的节点中删除文件?
    • 开箱即用是不可能的。您必须拦截该事件并 ping 其他一些负责清理的远程进程。
    猜你喜欢
    • 2019-06-18
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    相关资源
    最近更新 更多