我已经查看了“ExecutorLostFailure”的其他一些答案,其中大部分也是:
** 1.没有答案** ** 2.坚持增加执行程序内存和内核数量**
还有其他解决办法吗?我已经尝试了两种方法,但我不清楚如何正确地估算出SparkContext
中每个(内存和核心)的分配量。
错误发生在saveAsTextFile
操作中。感谢。
答案 0 :(得分:3)
根据我的经验,增加执行程序内存可以帮助。但我建议这是一个天真的解决方案,通常潜在的问题仍将存在。
我说这个的原因是Spark最重要的功能之一是它允许你对太大而不适合内存的数据集执行计算。理论上,您可以使用具有2GB内存的单个执行程序对1TB数据集执行大多数计算。
在我遇到OOM的每一种情况下,都是以下两个原因之一:
这仅适用于使用资源管理器(如Mesos或YARN)的情况。请查看Spark docs以获取相关指导。
回想一下,我说Spark可以处理太大而无法容纳在内存中的数据集。需要注意的是,数据集必须可垂直并行化 - 认为文本文件有10 ^ 8行,其中每行包含一个相对较小的数据点(例如浮点数列表,JSON字符串,单个句子等)。然后,Spark会对您的数据集进行分区,并向每个执行程序发送适当数量的行。
当单行非常大时会出现问题。这不太可能通过正常的map
类操作发生(除非你做的事情非常奇怪),但很容易通过聚合类型操作来完成,如groupByKey
或reduceByKey
。请考虑以下示例:
数据集(姓名,年龄):
John 30
Kelly 36
Steve 48
Jane 36
如果我以年龄作为关键字groupByKey
,我将获得以下格式的数据:
36 [Kelly, Jane]
30 [John]
48 [Steve]
如果初始数据集中的行数非常大,则生成的数据集中的行可能会很长。如果它们足够长,它们可能太大而无法放入执行程序内存中。
这取决于您的申请。在某些情况下,它可能确实是不可避免的,您可能只需增加执行程序内存。但通常可以重新构建算法以避免问题,例如:通过用groupByKey
替换countByKey
,或丢弃具有非常高发生率的数据点(在我观察到的一个案例中,它是一个生成数百万请求的机器人,负责该问题。可以安全地丢弃而不影响分析。)