背景:
我正在具有大量工作负载的大型群集上运行火花作业,该群集上始终有状态不佳的节点,该节点接收任务,响应驱动程序的心跳信号,不实际工作并且需要永远运行,最终可能会失败,因此驱动程序需要在其他地方重新提交任务。
我如何处理病态节点:
我正在将function theScore (students) {
var obj = {};
var score = 0;
for(i of students){
if(i.score > score ) {
score = i.score; // Keep track of the highest-score-found-so-far
obj = i; // Keep track of the highest scoring object
}
}
return obj;
}
设置为spark.blacklist.enabled
,以确保重新提交的任务转到其他地方(眨眼间完成工作)。但是,正如我在日志中发现的那样,黑名单仅适用于一个阶段:
True
因此,下一阶段肯定会再次尝试患病节点,并且很有可能患病节点可能不会恢复正常。我只是遇到这样的情况,一个节点将失败的任务保持48小时180次,并最终杀死了自己。
Blacklisting executor 28 for stage 0
像这样的执行器会严重影响Spark应用程序的性能。
所以我想出了计划B:我自己杀了它
我发现有两个函数可以管理执行器18/11/11 19:47:26 WARN cluster.YarnSchedulerBackend$YarnSchedulerEndpoint: Container marked as failed: container_1534870268016_1640615_01_000051 on host: ill-datanode. Exit status: -100. Diagnostics: Container released on a *lost* node
和SparkSession.sparkContext.killExecutor(executorId: String)
。但是,要使用此类功能删除执行程序,我必须知道上次作业中哪个执行程序失败。
该怎么做?