就RDD
持久性而言,火花中cache()
和persist()
之间的区别是什么?
答案 0 :(得分:208)
使用cache()
,您只使用默认存储级别MEMORY_ONLY
。
使用persist()
,您可以指定所需的存储级别(rdd-persistence)。
来自官方文档:
- 您可以使用
RDD
()或persist
()方法标记要保留的cache
。- 可以使用不同的
存储每个持久性RDD
storage level
cache
()方法是使用默认存储级别的简写,即StorageLevel.MEMORY_ONLY
(在内存中存储反序列化的对象)。
如果您要将persist()
以外的存储级别分配到MEMORY_ONLY
(which storage level to choose)
RDD
答案 1 :(得分:79)
缓存或持久性是(迭代和交互式)Spark计算的优化技术。它们有助于保存临时部分结果,因此可以在后续阶段重复使用。因此RDD
s的这些中间结果保存在内存(默认)或更稳固的存储中,如磁盘和/或复制。
RDD
可以使用cache
操作进行缓存。它们也可以使用persist
操作保留。
persist
,cache
这些功能可用于调整
RDD
的存储级别。 释放内存时,Spark将使用存储级别标识符 决定应该保留哪些分区。参数少变种persist
()和cache
()只是缩写persist(StorageLevel.MEMORY_ONLY).
警告 :更改存储级别后,无法再次更改!
仅仅因为你可以在内存中缓存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)
cache
和persist
操作之间的区别纯粹 句法。 cache是persist或persist(MEMORY_ONLY
)的同义词,即cache
仅为persist
,默认存储级别为MEMORY_ONLY
在这里看得更直观......
坚持内存和磁盘:
缓存可以在很大程度上提高应用程序的性能。
答案 2 :(得分:45)
没有区别。来自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()
答案 3 :(得分:21)
Spark提供了5种存储级别
MEMORY_ONLY
MEMORY_ONLY_SER
MEMORY_AND_DISK
MEMORY_AND_DISK_SER
DISK_ONLY
cache()
将使用MEMORY_ONLY
。如果您想使用其他内容,请使用persist(StorageLevel.<*type*>)
。
默认情况下persist()
会
将数据作为未序列化的对象存储在JVM堆中。
答案 4 :(得分:1)
Cache()和persist()这两种方法均用于提高火花计算的性能。这些方法有助于保存中间结果,因此可以在后续阶段中重复使用。
cache()和persist()之间的唯一区别是,使用Cache技术,我们只能在需要时将中间结果保存在内存中,而在Persist()中,我们可以将中间结果保存在5个存储级别中(MEMORY_ONLY,MEMORY_AND_DISK,MEMORY_ONLY_SER ,MEMORY_AND_DISK_SER,DISK_ONLY)。
答案 5 :(得分:0)
对于不耐烦:
在不传递参数的情况下,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 )
Voilà!