在RDD
持久性方面,cache()
和persist()
在spark中有什么区别?
使用cache()
,您只使用默认存储级别MEMORY_ONLY
。使用persist()
,您可以指定所需的存储级别(rdd-persistence)。
来自官方文档:
- 您可以使用
RDD
()或persist
()方法标记要保持的cache
。- 每个持久的
RDD
可以使用不同的storage level
存储cache
()方法是使用默认存储级别的简写,即StorageLevel.MEMORY_ONLY
(在内存中存储反序列化的对象)。
如果要将persist()
以外的存储级别分配给MEMORY_ONLY
(RDD
),请使用which storage level to choose
cache
和persist
操作之间的区别纯粹是语法上的。 cache是persist或persist(MEMORY_ONLY
)的同义词,即cache
只是persist
,默认存储级别为MEMORY_ONLY
/ ** *将此RDD保留为默认存储级别(
MEMORY_ONLY
)。 * / def persist():this.type = persist(StorageLevel.MEMORY_ONLY)/ ** *将此RDD保留为默认存储级别(
MEMORY_ONLY
)。 * / def cache():this.type = persist()
在这里看到更多细节......
缓存或持久性是(迭代和交互式)Spark计算的优化技术。它们有助于保存临时部分结果,因此可以在后续阶段重复使用。因此,RDD
s的这些中间结果保存在内存(默认)或更稳固的存储中,如磁盘和/或复制。可以使用RDD
操作缓存cache
s。它们也可以使用persist
操作持久化。
persist
,cache
这些功能可用于调整
RDD
的存储级别。释放内存时,Spark将使用存储级别标识符来决定应保留哪些分区。参数less variantspersist
()和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)
在这里看得更直观....
坚持内存和磁盘:
缓存可以在很大程度上提高应用程序的性能。
没有区别。来自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()
Spark提供5种类型的存储级别
MEMORY_ONLY
MEMORY_ONLY_SER
MEMORY_AND_DISK
MEMORY_AND_DISK_SER
DISK_ONLY
cache()
将使用MEMORY_ONLY
。如果你想使用其他东西,请使用persist(StorageLevel.<*type*>)
。
默认情况下,persist()
会将数据作为未序列化的对象存储在JVM堆中。
Cache()和persist()这两种方法都用于提高spark计算的性能。这些方法有助于保存中间结果,因此可以在后续阶段重复使用。
cache()和persist()之间的唯一区别是,使用Cache技术我们只能在需要时将中间结果保存在内存中,而在Persist()中我们可以将中间结果保存在5个存储级别(MEMORY_ONLY,MEMORY_AND_DISK,MEMORY_ONLY_SER,MEMORY_AND_DISK_SER, DISK_ONLY)。