在执行我的Spark程序期间,有时(它的原因对我来说仍然是一个谜)纱线杀死容器(执行器),给出了超出内存限制的消息。虽然Spark通过生成一个新容器重新执行任务,但我的程序确实恢复了。但是,在我的程序中,任务还会在磁盘上创建一些中间文件。当一个容器被杀死时,这些文件就会被遗忘。有没有办法我可以捕获执行程序 - 作为异常被杀死,以便我可以删除留下的中间文件。显然,异常处理代码也需要在运行执行程序的同一节点上运行,这样我就可以从那里删除文件。
答案 0 :(得分:5)
作为选项,您可以尝试使用SparkListener
功能。
因此,您可以创建自己的类并实现SparkListener
接口,以挂钩到可以自我解释的可用事件。
然后,您需要将该自定义侦听器添加到SparkContext
。
有两个选项:
SparkContext.addSparkListener(<your custom listener>)
spark.extraListeners
属性,更多信息http://spark.apache.org/docs/latest/configuration.html#available-properties 答案 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
/**
* 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(我还没试过)