需求
spark应用程序中,只要task失败就发送邮件,并携带错误原因。 我的GitHub,猛戳我
背景
在spark程序中,task有失败重试机制(根据 spark.task.maxFailures
配置,默认是4次),当task执行失败时,并不会直接导致整个应用程序down掉,只有在重试了 spark.task.maxFailures
次后任然失败的情况下才会使程序down掉。另外,spark on yarn模式还会受yarn的重试机制去重启这个spark程序,根据 yarn.resourcemanager.am.max-attempts
配置(默认是2次)。
即使spark程序task失败4次后,受yarn控制重启后在第4次执行成功了,一切都好像没有发生,我们只有通过spark的监控UI去看是否有失败的task,若有还得去查找看是哪个task由于什么原因失败了。基于以上原因,我们需要做个task失败的监控,只要失败就带上错误原因通知我们,及时发现问题,促使我们的程序更加健壮。
捕获Task失败事件
顺藤摸瓜,task在Executor中执行,跟踪源码看task在失败后都干了啥?
1.在executor中task执行完不管成功与否都会向execBackend报告task的状态;
execBackend.statusUpdate(taskId, TaskState.FINISHED, serializedResult)
2.在CoarseGrainedExecutorBackend中会向driver发送StatusUpdate状态变更信息;
override def statusUpdate(taskId: Long, state: TaskState, data: ByteBuffer) {
val msg =