Spark“ExecutorLostFailure” - 如何解决?
Posted
技术标签:
【中文标题】Spark“ExecutorLostFailure” - 如何解决?【英文标题】:Spark "ExecutorLostFailure" - how to solve? 【发布时间】:2015-12-07 20:30:37 【问题描述】:我已经查看了有关“ExecutorLostFailure”的其他一些答案,其中大多数都是:
** 1. 没有答案** ** 2. 坚持增加执行器内存和核心数**
这里有一些我指的是:hereherehere
还有其他解决方案吗?我都试过了,但我不清楚如何正确衡量在我的SparkContext
中为每个(内存和内核)分配多少。
错误发生在saveAsTextFile
操作中。谢谢。
【问题讨论】:
增加内存,直到你不再失去执行者当然:)。实际上解决方案要麻烦得多。你必须弄清楚为什么你会失去执行人,然后尝试解决这个问题。您应该从执行程序日志开始,但它们可能不会告诉您太多。这可能是一项非常困难的侦探工作,需要对整个系统有深入的了解。祝你好运! 我要补充一点,许多 ExecutorLostFailures(几乎总是 OOM 异常的结果)可以通过增加应用程序中的分区数量来解决。但总的来说,我同意@DanielDarabos 的观点,即您需要查看执行程序日志以确保它是由 OOM 异常引起的。 【参考方案1】:根据我的经验,增加执行器内存可以提供帮助。但我建议这是一个幼稚的解决方案,通常根本问题仍然存在。
我之所以这么说是因为 Spark 最重要的功能之一是它允许您对太大而无法放入内存的数据集执行计算。理论上,您可以使用具有 2GB 内存的单个执行器对 1TB 数据集执行大多数计算。
在我遇到 OOM 的每一个案例中,都是以下两个原因之一:
1。执行器内存开销不足
这仅适用于使用 Mesos 或 YARN 等资源管理器的情况)。请查看Spark docs 获取相关指导。
2。您在转换中所做的某件事导致您的 RDD 变得非常“水平”。
回想一下,我说过 Spark 可以处理太大而无法放入内存的数据集。需要注意的是,数据集必须垂直并行 - 考虑一个具有 10^8 行的文本文件,其中每行包含一个相对较小的数据点(例如浮点数列表、JSON 字符串、单个句子等)。然后 Spark 将对您的数据集进行分区并向每个执行程序发送适当数量的行。
当单行非常大时会出现问题。这不太可能通过普通的map
类操作发生(除非您正在做一些很奇怪的事情),但是通过像groupByKey
或reduceByKey
这样的聚合类型操作 很容易做到。考虑以下示例:
数据集(姓名、年龄):
John 30
Kelly 36
Steve 48
Jane 36
如果我随后以 age 为键执行groupByKey
,我将获得以下形式的数据:
36 [Kelly, Jane]
30 [John]
48 [Steve]
如果初始数据集中的行数非常多,则结果数据集中的行可能会非常长。如果它们足够长,它们可能太大而无法放入执行程序内存中。
解决办法?
这取决于您的应用程序。在某些情况下,它可能确实是不可避免的,您可能只需要增加执行器内存。但通常可以重组你的算法来避免这个问题,例如通过将groupByKey
替换为countByKey
,或者丢弃具有非常高发生率的数据点(在我观察到的一种情况下,它是一个产生数百万个请求的机器人导致了这个问题。这些可以安全地丢弃不影响分析)。
【讨论】:
以上是关于Spark“ExecutorLostFailure” - 如何解决?的主要内容,如果未能解决你的问题,请参考以下文章
火花作业中的 Azure databricks 群集错误:ExecutorLostFailure
spark任务执行过程中经常性的failed但是任务并没有失败最后总能跑完