我在独立模式下运行 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()?
目前据我所知,Spark 默认使用LRU(最近较少使用)的 RDD 分区驱逐策略。他们正在努力添加新策略。 https://issues.apache.org/jira/browse/SPARK-14289
此策略删除最近较少使用的元素。当将元素放入缓存或从缓存中检索元素时,将更新上次使用的时间戳。
我想你的内存中总会有 10 个分区,但哪些分区存储在内存中,哪些分区将被驱逐取决于它们的使用情况。根据Apache 常见问题解答:
同样,不适合内存的缓存数据集要么会溢出到磁盘,要么会在需要时即时重新计算,具体取决于 RDD 的存储级别。
因此,其他分区是否溢出到磁盘或动态重新计算取决于您的配置。重新计算是默认选项,这并不总是最有效的选项。您可以将数据集的存储级别设置为 MEMORY_AND_DISK 以避免这种情况。
| 归档时间: |
|
| 查看次数: |
6610 次 |
| 最近记录: |