Spark如何逐出缓存分区?

时间:2017-03-07 23:36:40

标签: apache-spark

我在独立模式下运行Spark 2.0,而且我是唯一一个在我的集群中提交作业的人。

假设我有一个包含100个分区的RDD,并且一次只有10个分区适合内存。

我们还假设分配的执行内存足够,不会干扰存储内存。

假设我迭代该RDD中的数据。

rdd.persist()  // MEMORY_ONLY

for (_ <- 0 until 10) {
  rdd.map(...).reduce(...)
}

rdd.unpersist()

对于每次迭代,持久化的前10个分区是否始终在内存中,直到rdd.unpersist()

2 个答案:

答案 0 :(得分:3)

目前我所知道的Spark默认使用 LRU(最近使用较少)驱逐策略作为RDD分区。他们正在努力增加新战略。 https://issues.apache.org/jira/browse/SPARK-14289

此策略删除最近使用较少的元素当将元素放入缓存或从缓存中检索元素时,将更新上次使用的时间戳。

我想你的内存中总会有10个分区,但它们存储在内存中并且会被驱逐取决于它们的用途。根据Apache FAQ:

  

同样,不适合内存的缓存数据集要么溢出   根据需要确定磁盘或在需要时重新计算   RDD的存储级别。

因此,如果其他分区溢出到磁盘或动态重新计算,则取决于您的配置。重新计算是默认选项,并不总是最有效的选项。您可以将数据集的存储级别设置为MEMORY_AND_DISK,以避免这种情况。

答案 1 :(得分:0)

我想我找到了答案,所以我要回答我自己的问题。

驱逐政策似乎属于MemoryStore类。这是source code

似乎不会逐出条目来为同一个RDD中的条目腾出空间。