Apache spark 有没有办法捕获Spark中执行器终止的异常?
在执行Spark程序的过程中,有时(原因对我来说仍然是个谜)会杀死容器(执行器),并发出内存已超过限制的消息。我的程序通过生成一个新的容器重新执行任务来恢复。但是,在我的程序中,任务也会在磁盘上创建一些中间文件。当一个容器被杀死时,这些文件被留下。是否有一种方法可以捕获作为异常被杀死的执行器,以便删除留下的中间文件。显然,异常处理代码还需要在执行器运行的同一节点上运行,这样我就可以从那里删除文件。作为一个选项,您可以尝试使用Apache spark 有没有办法捕获Spark中执行器终止的异常?,apache-spark,bigdata,yarn,Apache Spark,Bigdata,Yarn,在执行Spark程序的过程中,有时(原因对我来说仍然是个谜)会杀死容器(执行器),并发出内存已超过限制的消息。我的程序通过生成一个新的容器重新执行任务来恢复。但是,在我的程序中,任务也会在磁盘上创建一些中间文件。当一个容器被杀死时,这些文件被留下。是否有一种方法可以捕获作为异常被杀死的执行器,以便删除留下的中间文件。显然,异常处理代码还需要在执行器运行的同一节点上运行,这样我就可以从那里删除文件。作为一个选项,您可以尝试使用SparkListener功能。 因此,您可以创建自己的类并实现Spar
SparkListener
功能。
因此,您可以创建自己的类并实现SparkListener
接口,以连接到非常自解释的可用事件中。
然后需要将该自定义侦听器添加到SparkContext
有两个选项可供选择:
SparkContext.addSparkListener()
- 通过
property,此处有更多信息spark.extrallisteners
- SparkListenerApplicationStart
- SparkListenerJobStart
- SparkListener Stage提交
- SparkListenerTaskStart
- SparkListenerTaskGettingResult
- SparkListenerTaskEnd
- SparkListener Stage已完成
- 斯派克利斯特纳乔本德酒店
- SparkListenerapplicationnd
- SparkListenerEnvironmentUpdate
- SparkListenerBlockManageded
- SparkListenerBlockManagerRemoved
- SparkListenerBlockUpdated
- SparkListenerUnpersistRDD
- 添加了SparkListener
- 火花塞已移除
- 在@Taras Matyashovsky答案之上添加
下面是可用的侦听器事件列表
请看一看哪种可能适合你(我没有试过)我明白了。但是SparkListener必须在驱动程序节点上执行,因此如何从被终止的执行程序执行的节点终止文件?驱动程序必须在其整个生命周期内侦听并接受来自其执行程序的传入连接(例如,请参阅网络配置部分中的spark.driver.port和spark.fileserver.port)。因此,驱动程序必须可以从工作节点进行网络寻址。请参见本课程HeartbeatReceiver.scala,作为答案中更新的示例。谢谢您的答案。但看起来SparkListener是在驱动程序节点上执行的。那么,如何从被杀死的执行器执行的节点删除文件呢?这是不可能的。您必须截获事件并ping其他负责清理的远程进程。
/**
* 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) ...