Spark使用哪种内存部分来计算不会持久化的RDD

时间:2015-07-19 22:30:08

标签: apache-spark shuffle rdd

我是Spark的新手,我明白Spark会将执行程序内存分为以下几部分:

RDD存储:哪个Spark使用.persist()或.cache()来存储持久化的RDD,可以通过设置spark.storage.memoryFraction(默认值为0.6)来定义

随机播放和聚合缓冲区:Spark用于存储随机播放输出。它可以使用spark.shuffle.memoryFraction定义。如果shuffle输出超过此分数,则Spark会将数据溢出到磁盘(默认为0.2)

用户代码: Spark使用此分数执行任意用户代码(默认为0.2)

为简单起见,我没有提及存储和随机播放安全分数。

我的问题是,Spark使用哪个内存部分来计算和转换不会持久化的RDD?例如:

lines = sc.textFile("i am a big file.txt")
count = lines.flatMap(lambda x: x.split(' ')).map(lambda x: (x, 1)).reduceByKey(add)

此处Spark不会立即加载整个文件,并会对输入文件进行分区,并在单个阶段中对每个分区执行所有这些转换。但是,Spark将用于加载分区行的内存部分,计算flatMap()和map()?

由于

更新
上面显示的代码只是实际应用程序的一个子集,因为count使用saveAsTextFile保存,这将触发RDD计算。此外,我的问题是Spark的行为通用,而不是特定于发布的示例

2 个答案:

答案 0 :(得分:0)

这是我在Spark的邮件列表中从Andrew Or那里得到的答案:

  

这将是JVM中剩下的任何东西。这不是明确的   由存储或随机播放等部分控制。然而   计算通常不需要使用那么多空间。在我的   体验它几乎总是缓存或聚合期间   洗牌是内存最密集的。

答案 1 :(得分:0)

来自spark官方指南: http://spark.apache.org/docs/latest/tuning.html#memory-management-overview

来自上面的链接:

- spark.memory.fraction expresses the size of M as a fraction of the (JVM heap space - 300MB) (default 0.75). The rest of the space (25%) is reserved for user data structures, internal metadata in Spark, and safeguarding against OOM errors in the case of sparse and unusually large records.
- spark.memory.storageFraction expresses the size of R as a fraction of M (default 0.5). R is the storage space within M where cached blocks immune to being evicted by execution.