Memory management 火花“;遗嘱执行人损失失败如何解决?
我已经查阅了关于“ExecutorLostFailure”的其他一些答案,其中大多数答案是: **一,。没有答案** ** 2. 坚持增加执行器内存和内核数量** 以下是我指的一些: 还有其他解决办法吗?我已经尝试了这两种方法,但我不清楚如何在我的Memory management 火花“;遗嘱执行人损失失败如何解决?,memory-management,apache-spark,out-of-memory,pyspark,Memory Management,Apache Spark,Out Of Memory,Pyspark,我已经查阅了关于“ExecutorLostFailure”的其他一些答案,其中大多数答案是: **一,。没有答案** ** 2. 坚持增加执行器内存和内核数量** 以下是我指的一些: 还有其他解决办法吗?我已经尝试了这两种方法,但我不清楚如何在我的SparkContext中正确估计每个(内存和内核)分配多少 该错误发生在saveAsTextFile操作中。谢谢。根据我的经验,增加执行器内存会有所帮助。但我认为这是一个幼稚的解决方案,通常根本的问题仍然存在 我之所以这么说,是因为Spark最重要
SparkContext
中正确估计每个(内存和内核)分配多少
该错误发生在
saveAsTextFile
操作中。谢谢。根据我的经验,增加执行器内存会有所帮助。但我认为这是一个幼稚的解决方案,通常根本的问题仍然存在
我之所以这么说,是因为Spark最重要的功能之一是,它允许您对太大而无法放入内存的数据集执行计算。理论上,您可以使用一个具有2GB内存的执行器在1TB数据集上执行大多数计算
在我遇到的每一个OOM案例中,它都是以下两个原因之一:
1.执行器内存开销不足
这仅适用于使用资源管理器(如Mesos或Thread)的情况。用此检查指南
2.您在转换中所做的某些事情会导致RDD变得非常“水平”。
回想一下,我说过Spark可以处理太大而无法放入内存的数据集。需要注意的是,数据集必须是垂直可并行的——想想一个有10^8行的文本文件,其中每行包含一个相对较小的数据点(例如浮点列表、JSON字符串、一个句子等)。Spark随后将对数据集进行分区,并向每个执行者发送适当数量的行
当单行非常大时,就会出现问题。这不太可能通过正常的map
类操作发生(除非您正在做一些非常奇怪的事情),但通过聚合类型操作如groupByKey
或reduceByKey
非常容易做到。考虑下面的例子:
数据集(名称、年龄):
如果我随后使用age
作为键执行groupByKey
,我将以以下形式获取数据:
36 [Kelly, Jane]
30 [John]
48 [Steve]
如果初始数据集中的行数非常大,则结果数据集中的行可能非常长。如果它们足够长,则可能太大,无法装入执行器内存
解决方案是什么?
这取决于你的申请。在某些情况下,这确实是不可避免的,您可能需要增加执行器内存。但通常可以重新构造算法以避免问题,例如,用
countByKey
替换groupByKey
,或者丢弃发生率非常高的数据点(在一个案例中,我观察到,是一个机器人生成了数百万个请求,导致了这个问题。这些请求可以安全地丢弃,而不会影响分析)。根据我的经验,增加执行器内存会有所帮助。但我认为这是一个幼稚的解决方案,通常潜在的问题仍然存在
我之所以这么说,是因为Spark最重要的功能之一是,它允许您在太大而无法放入内存的数据集上执行计算。理论上,您可以在1TB数据集上执行大多数计算,而单个执行器的内存为2GB
在我遇到的每一个OOM案例中,它都是以下两个原因之一:
1.执行器内存开销不足
这仅适用于使用资源管理器(如Mesos或Thread)的情况。用此检查指南
2.您在转换中所做的某些事情会导致RDD变得非常“水平”。
回想一下,我说过Spark可以处理太大而无法放入内存的数据集。需要注意的是,数据集必须是垂直可并行的——想想一个有10^8行的文本文件,其中每行包含一个相对较小的数据点(例如浮点列表、JSON字符串、一个句子等)。Spark随后将对数据集进行分区,并向每个执行者发送适当数量的行
当单行非常大时,就会出现问题。这不太可能通过正常的map
类操作发生(除非您正在做一些非常奇怪的事情),但通过聚合类型操作如groupByKey
或reduceByKey
非常容易做到。考虑下面的例子:
数据集(名称、年龄):
如果我随后使用age
作为键执行groupByKey
,我将以以下形式获取数据:
36 [Kelly, Jane]
30 [John]
48 [Steve]
如果初始数据集中的行数非常大,则结果数据集中的行可能非常长。如果它们足够长,则可能太大,无法装入执行器内存
解决方案是什么?
这取决于你的申请。在某些情况下,这确实是不可避免的,您可能需要增加执行器内存。但通常可以重新构造算法以避免问题,例如,用
countByKey
替换groupByKey
,或者丢弃发生率非常高的数据点(在一个案例中,我观察到,是一个机器人生成了数百万个请求。这些请求可以安全地丢弃,而不会影响分析)。增加内存,直到您停止丢失执行器为止,当然:)。事实上,解决办法要麻烦得多。你必须弄清楚为什么你会失去遗嘱执行人,然后设法解决这个问题。您应该从executor日志开始,但它们可能不会告诉您太多。这可能是非常困难的侦查工作,需要对整个系统有深入的了解。祝你好运我要补充的是,许多ExecutorLostFailure(几乎总是OOM异常的结果)可以通过简单地增加内存中的分区数量来解决