首页 > 解决方案 > spark - 如何知道在 Job 执行期间哪个执行器失败并避免它们?

问题描述

背景:

我正在一个巨大的集群上运行一个 Spark 作业,该集群具有繁重的工作负载,不断有状态不佳的节点,它接收任务,响应驱动程序的心跳,实际上没有工作,并且需要永远运行,并且最终可能会失败,所以驱动程序需要重新将任务提交到其他地方。

我做了什么来处理状态不佳的节点:

我正在设置spark.blacklist.enabledTrue确保重新提交的任务转到其他地方(并且眨眼间就完成了)。但是,正如我在日志中发现的那样,黑名单仅适用于一个阶段:

Blacklisting executor 28 for stage 0

所以下一阶段肯定会再次尝试故障节点,并且故障节点很可能无法恢复正常。我刚刚遇到过这样的情况,一个节点在 48 小时内不断失败任务 180 次,最后就杀死了自己。

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

像这样的执行器会严重拖累 Spark 应用程序的性能。

所以我想出了B计划:我自己杀了它

我发现有 2 个函数可以管理名为SparkSession.sparkContext.killExecutor(executorId: String)和的执行程序requestExecutors(numAdditionalExecutors: Int)。但是要使用这样的功能删除执行者,我必须知道哪个执行者在上次工作中失败了。

怎么做?

标签: apache-sparkhadoop-yarn

解决方案


推荐阅读