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

Posted

技术标签:

【中文标题】Spark 使用哪个内存部分来计算不会被持久化的 RDD【英文标题】:Which memory fraction is Spark using to compute RDDs that are not going to be persisted 【发布时间】:2015-10-08 23:49:04 【问题描述】:

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

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

Shuffle 和聚合缓冲区:Spark 用于存储 shuffle 输出。它可以使用 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 的行为是通用的,而不是特定于发布的示例

【问题讨论】:

好问题。你能运行实验,用 0.0 存储内存计算地图后的行数吗? (我猜它会完成,但我不知道) @AlisterLee 我实际上用 0 spark.storage.memoryFraction 进行了一个实验,它工作得很好,这是预期的行为,因为我没有在这里缓存任何东西。此外,当我以 0.6 的存储内存分数运行应用程序时,它表明我正在使用来自存储内存分数的零字节 因此,如果它不使用存储或随机播放,那么您是否回答了自己的问题?您可以通过逐渐耗尽用户内存的实验来证明这一点。 @AlisterLee 实际上我不确定它是否没有使用随机播放分数。虽然我可以说它没有使用存储分数。 如果你的阶段不需要随机播放,那么它就没有使用随机播放内存 - reduceByKey 会随机播放,你需要随机播放。 【参考方案1】:

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

这将是 JVM 中剩下的任何内容。这不是明确的 由存储或洗牌之类的分数控制。然而 计算通常不需要使用那么多空间。在我的 体验过程中几乎总是缓存或聚合 最占用内存的随机播放。

【讨论】:

【参考方案2】:

来自 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.

【讨论】:

以上是关于Spark 使用哪个内存部分来计算不会被持久化的 RDD的主要内容,如果未能解决你的问题,请参考以下文章

spark的调优

3天掌握Spark-- RDD持久化

Apache Spark:主要使用理念

spark调优:RDD重构和持久化

spark shuffle

Spark与缓存