apache-spark - spark - 如何知道在 Job 执行期间哪个执行器失败并避免它们?
问题描述
背景:
我正在一个巨大的集群上运行一个 Spark 作业,该集群具有繁重的工作负载,不断有状态不佳的节点,它接收任务,响应驱动程序的心跳,实际上没有工作,并且需要永远运行,并且最终可能会失败,所以驱动程序需要重新将任务提交到其他地方。
我做了什么来处理状态不佳的节点:
我正在设置spark.blacklist.enabled
以True
确保重新提交的任务转到其他地方(并且眨眼间就完成了)。但是,正如我在日志中发现的那样,黑名单仅适用于一个阶段:
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)
。但是要使用这样的功能删除执行者,我必须知道哪个执行者在上次工作中失败了。
怎么做?
解决方案
推荐阅读
- c# - Prepare() 方法的正确位置是什么?在定义参数(及其类型和大小)之前还是之后?
- c# - 将旧的异步模式包装到 TaskCompletionSource 时返回等待?
- c# - 无法转换为类型 'MongoDB.Bson.Serialization.IBsonSerializer`1[System.String]'
- r - Shiny:如何在日志中打印更新对象的名称?
- javascript - 从子函数调用时反应父属性函数不触发
- typo3 - 如何在打字稿中启用 showPermaLogin?
- scala - Scala 的 mutable.ListBuffer 似乎使用了 List 的 tail 函数,但它被记录为具有线性复杂性?
- html - 如何为矩形的对角线设置动画?
- javascript - 在 chrome 扩展中捕获文件上传/下载事件?
- flutter - Flutter 在 Google 地图小部件中默认显示标记的 infoWindowText