我以独立模式运行Spark2.0,我是集群中唯一一个提交作业的人。
假设我有一个RDD,它有100个分区,每次只有10个分区可以在内存中使用。
我们还假设分配的执行内存足够了,并且不会干扰存储内存。
假设我迭代了RDD中的数据。
rdd.persist() // MEMORY_ONLY
for (_ <- 0 until 10) {
rdd.map(...).reduce(...)
}
rdd.unpersist()
对于每次迭代,前10个被持久化的分区会一直在内存中直到rdd.unpersist()
发布于 2017-03-08 16:46:35
发布于 2017-03-08 00:36:38
现在,我所知道的是,Spark正在使用LRU (最近使用的较少)驱逐策略作为RDD分区的默认设置。他们正在努力增加新的战略。https://issues.apache.org/jira/browse/SPARK-14289
此策略移除最近使用较少的元素,在将元素放入缓存或从缓存中检索元素时更新上一次使用的时间戳。
我想您的内存中总是有10个分区,但是哪些分区存储在内存中,哪些分区将被逐出取决于它们的使用。根据Apache FAQ
同样,不适合内存的缓存数据集或者溢出到磁盘,或者在需要时动态重新计算,这是由RDD的存储级别决定的。
因此,如果其他分区溢出到磁盘或动态重新计算,则取决于您的配置。默认情况下,重新计算并不总是最有效的选项。您可以将数据集的存储级别设置为MEMORY_AND_DISK,以避免这种情况。
https://stackoverflow.com/questions/42660385
复制相似问题