缓存和持久化有啥区别?
Posted
技术标签:
【中文标题】缓存和持久化有啥区别?【英文标题】:What is the difference between cache and persist?缓存和持久化有什么区别? 【发布时间】:2015-01-08 08:02:27 【问题描述】:在RDD
持久化方面,spark中的cache()
和persist()
有什么区别?
【问题讨论】:
【参考方案1】:使用cache()
,您只使用默认存储级别:
MEMORY_ONLY
代表 RDD
MEMORY_AND_DISK
代表 数据集
使用 persist()
,您可以为 RDD 和 Dataset 指定所需的存储级别。
来自官方文档:
您可以使用persist
() 或cache
() 方法将RDD
标记为持久化。 每个持久化的RDD
可以使用不同的storage level
存储cache
() 方法是使用默认存储级别的简写,即StorageLevel.MEMORY_ONLY
(将反序列化的对象存储在内存中)。
如果您想分配除以下之外的存储级别,请使用persist()
:
MEMORY_ONLY
RDD
或MEMORY_AND_DISK
用于数据集
官方文档的有趣链接:which storage level to choose
【讨论】:
请注意,cache()
现在使用 MEMORY_AND_DISK
我不认为上面的评论是正确的。阅读最新的官方文档,使用 ahars 提供的链接与最后一个要点对齐... cache() 方法是使用默认存储级别的简写,即 StorageLevel.MEMORY_ONLY(将反序列化的对象存储在内存中)。跨度>
@ximiki , MEMORY_AND_DISK
是仅适用于数据集的默认值。 MEMORY_ONLY
仍然是 RDD 的默认值
@user2596560 注释对于数据集的默认缓存值是正确的。您适合仍然保留 MEMORY_ONLY 默认值的 RDD【参考方案2】:
cache
和persist
操作之间的区别纯粹是 句法。 cache 是 persist 或 persist(MEMORY_ONLY
) 的同义词,即cache
只是persist
具有默认存储级别MEMORY_ONLY
但是
Persist()
我们可以将中间结果保存在 5 个存储级别中。MEMORY_ONLY MEMORY_AND_DISK MEMORY_ONLY_SER MEMORY_AND_DISK_SER DISK_ONLY
/** * 以默认存储级别持久化这个 RDD (
MEMORY_ONLY
)。 */ def persist(): this.type = 持久化(StorageLevel.MEMORY_ONLY)/** * 以默认存储级别持久化这个 RDD (
MEMORY_ONLY
)。 */ def cache(): this.type = persist()
在此处查看更多详细信息...
缓存或持久性是用于(迭代和交互式)Spark 计算的优化技术。它们有助于保存临时部分结果,以便在后续阶段重复使用。这些临时结果作为RDD
s 因此保存在内存(默认)或更可靠的存储(如磁盘)中和/或复制。
RDD
s 可以使用cache
操作进行缓存。它们也可以使用persist
操作进行持久化。
#
persist
,cache
这些函数可用于调整
RDD
的存储级别。 在释放内存时,Spark 会使用存储级别标识符 决定应该保留哪些分区。无参数变体persist
() 和cache
() 只是缩写persist(StorageLevel.MEMORY_ONLY).
警告:存储级别一旦更改,就不能再更改!
警告 - 明智地缓存...见 ((Why) do we need to call cache or persist on a RDD)
仅仅因为你可以在内存中缓存RDD
并不意味着你应该盲目地这样做。根据数据集被访问的次数和所涉及的工作量,重新计算可能比内存压力增加所付出的代价更快。
不用说,如果你只在没有缓存意义的情况下读取数据集,它实际上会使你的工作变慢。从 Spark Shell 可以看到缓存数据集的大小..
列出变体...
def cache(): RDD[T]
def persist(): RDD[T]
def persist(newLevel: StorageLevel): RDD[T]
见下例:
val c = sc.parallelize(List("Gnu", "Cat", "Rat", "Dog", "Gnu", "Rat"), 2)
c.getStorageLevel
res0: org.apache.spark.storage.StorageLevel = StorageLevel(false, false, false, false, 1)
c.cache
c.getStorageLevel
res2: org.apache.spark.storage.StorageLevel = StorageLevel(false, true, false, true, 1)
注意:
由于RDD
s 的缓存和持久性之间存在非常小的纯语法差异,这两个术语经常互换使用。
在这里更直观地查看......
持久化内存和磁盘:
缓存
缓存可以在很大程度上提高应用程序的性能。
【讨论】:
我在一个块中有一个 DF。我怎样才能访问它。【参考方案3】:没有区别。来自RDD.scala
。
/** Persist this RDD with the default storage level (`MEMORY_ONLY`). */
def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)
/** Persist this RDD with the default storage level (`MEMORY_ONLY`). */
def cache(): this.type = persist()
【讨论】:
【参考方案4】:Spark 提供 5 种存储级别
MEMORY_ONLY
MEMORY_ONLY_SER
MEMORY_AND_DISK
MEMORY_AND_DISK_SER
DISK_ONLY
cache()
将使用MEMORY_ONLY
。如果您想使用其他内容,请使用persist(StorageLevel.<*type*>)
。
默认persist()
会
将数据作为非序列化对象存储在 JVM 堆中。
【讨论】:
【参考方案5】:Cache() 和 persist() 这两种方法都用于提高 spark 计算的性能。这些方法有助于保存中间结果,以便在后续阶段重复使用。
cache() 和 persist() 的唯一区别是,使用 Cache 技术,我们可以仅在需要时将中间结果保存在内存中,而在 Persist() 中,我们可以将中间结果保存在 5 个存储级别(MEMORY_ONLY、MEMORY_AND_DISK、MEMORY_ONLY_SER , MEMORY_AND_DISK_SER, DISK_ONLY)。
【讨论】:
【参考方案6】:对于不耐烦:
相同
不传参数,persist()
和cache()
是一样的,默认设置:
RDD
: MEMORY_ONLY
当Dataset
:MEMORY_AND_DISK
区别:
与cache()
不同,persist()
允许您在括号内传递参数,以指定级别:
persist(MEMORY_ONLY)
persist(MEMORY_ONLY_SER)
persist(MEMORY_AND_DISK)
persist(MEMORY_AND_DISK_SER )
persist(DISK_ONLY )
瞧!
【讨论】:
以上是关于缓存和持久化有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章