Spark 如何逐出缓存分区?

Rus*_*ell 3 apache-spark

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

假设我有一个包含 100 个分区的 RDD,并且一次总共只能容纳 10 个分区。

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

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

rdd.persist()  // MEMORY_ONLY

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

rdd.unpersist()
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*cek 5

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

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

我想你的内存中总会有 10 个分区,但哪些分区存储在内存中,哪些分区将被驱逐取决于它们的使用情况。根据Apache 常见问题解答

同样,不适合内存的缓存数据集要么会溢出到磁盘,要么会在需要时即时重新计算,具体取决于 RDD 的存储级别。

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