代码
from pyspark import SparkConf, SparkContext
import pyspark
rdd = sc.textFile('file:///myBigFile.xml')
rdd.persist(pyspark.StorageLevel.DISK_ONLY)
rdd.take(60).show() ****Blows up here****
阅读StorageLevel
上的文档
用于控制RDD的存储的标志。每个StorageLevel记录 是否使用内存,是否将RDD掉到磁盘上 记忆力
如果这是真的,那么为什么这段代码会吹破垫片呢?
其他人也遇到了类似的情况,并且似乎是一个公开的缺陷。
如下所述: SPARK-24961-排序操作导致内存不足 https://issues.apache.org/jira/browse/SPARK-24961
答案 0 :(得分:0)
不幸的是,根据我的经验,这是一个普遍的问题;即使您指定DISK_ONLY或MEMORY_AND_DISK,持久性似乎也会消耗一些内存,并且很容易导致OutOfMemoryErrors。
请注意,Tf vc merge $/proj/branch1 $/proj/branch2 /baseless /recursive
仅在重复使用相同的RDD并且需要避免从原始数据集中重新生成时才值得使用。如果只使用一次或两次,通常可以更快地使其不受干扰,并且由于内存错误而失败的可能性要小得多。
您可能还想尝试增加分配给执行程序的内存量;这可能足以避免错误。
答案 1 :(得分:0)
我认为这可能是对持久化操作的错误使用。 Persist用于将整个rdd内容存储到给定位置,默认存储在内存中。您的rdd是一个50GB的文件,该文件无法放入内存。 StorageLevel.DISK_ONLY会将您的文件复制到spark的临时位置。这样,您的文件就可以在磁盘上以两个副本的形式存在,而不会增加价值。
1: rdd = sc.textFile('file:///myBigFile.xml')
2: small_rdd = heavy_computation(rdd).persist()
3: rdd1 = more_heavy_computation(small_rdd)
4: rdd2 = more_heavy_computation(small_rdd)
在此示例中,中间结果(2 :)由persist()存储到内存中。我认为中间结果的计算非常昂贵(大量时间占用大量CPU)并适合内存。您需要两次结果(3:/ 4 :)。如果不使用持久化,则第3行和第4行将重新计算heavy_computation。一次使用persist()重算法,中间结果用于3 + 4。
注意:如果中间结果的计算非常昂贵,但不适合内存,则可以使用DISK_ONLY。例如,要计算一整天的中间结果,最好将其保存到磁盘上,而不是第二次进行计算。
注意,spark很懒。上面的示例没有说明,添加此代码后cpu将开始工作:
6: rdd1.show()
7: rdd2.show()
诸如show / save / write / ...之类的操作使spark开始计算。
rdd = sc.textFile('file:///myBigFile.xml')
rdd.take(60).show()
这将快速运行,并且不应耗尽内存。