本地模式下的Spark StorageLevel无法正常工作吗?

时间:2019-01-31 21:06:31

标签: apache-spark pyspark

  • 以本地模式运行
  • 计算机的内存: 16GB
  • 计算机的可用磁盘空间: 500GB
  • 输入文件大小: 50GB
  • 错误消息: java.lang.OutOfMemoryError:Java堆空间
  • 代码:在命令窗口中使用。\ pyspark后键入Windows命令提示符

代码

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

2 个答案:

答案 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()

这将快速运行,并且不应耗尽内存。

相关问题