我在独立模式下运行 Spark 2.0,并且我是集群中唯一提交作业的人。
假设我有一个包含 100 个分区的 RDD,并且一次总共只能容纳 10 个分区。
我们还假设分配的执行内存足够并且不会干扰存储内存。
假设我迭代该 RDD 中的数据。
rdd.persist() // MEMORY_ONLY
for (_ <- 0 until 10) {
rdd.map(...).reduce(...)
}
rdd.unpersist()
对于每次迭代,前 10 个持久化的分区将始终保留在内存中,直到rdd.unpersist()
?
目前我所知道的 Spark 使用的是LRU(最近最少使用)驱逐策略RDD 分区默认。他们正在努力添加新策略。https://issues.apache.org/jira/browse/SPARK-14289
此策略删除最近较少使用的元素。当将元素放入缓存或从缓存中检索元素时,将更新上次使用的时间戳。
我想你的内存中总会有 10 个分区,但哪些分区存储在内存中,哪些分区将被驱逐取决于它们的使用情况。根据阿帕奇常见问题解答:
同样,不适合内存的缓存数据集要么会溢出
磁盘或在需要时重新计算,由
RDD的存储级别。
因此,其他分区是否溢出到磁盘或动态重新计算取决于您的配置。重新计算是默认选项,这并不总是最有效的选择。您可以将数据集的存储级别设置为 MEMORY_AND_DISK 以避免这种情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)