我创建了一个执行多个操作的spark作业,同时使用长累加器收集每个操作的记录数。我已经实现了Spark监听器来获取与任务,阶段和作业相关的信息。 侦听器中的onTaskEnd方法可以访问每个任务详细信息,例如id,status,accumulators。
例如:
覆盖def onTaskEnd(taskEnd:SparkListenerTaskEnd){
taskEnd.taskInfo.accumulables.foreach(f => { println(“任务结束状态:”+ taskEnd.taskInfo.status) LOG.info(“Acc iD:”+ f.id +“Acc name:”+ f.name.get +“Acc value:”+ f.value.get +“Acc update:” + f .update) }) }
上面的代码迭代任务中存在的所有可用累加器,并打印任务状态 例如RUNNING,SUCCESS,FAILED。
在我的应用程序中,为每个处理单元创建一个长累加器。我的目标是确定失败的处理单元。
当作业失败时,失败任务显示失败状态但不显示长累加器,而内部累加器(如internal.metrics.executorRunTimeaccumulator,internal.metrics.peakExecutionMemoryaccumulator等)可访问。 我尝试在侦听器的onTaskStart / onTaskEnd方法中访问长累加器,但它们不存在于累加器中。
因此,我无法确定失败的处理单元。
有人可以告诉我工作失败后积累物中没有长累加器的原因。
谢谢,