缓存和持久有什么区别? (为什么)我们需要在RDD上调用缓存或持久化

问题描述 投票:194回答:5

RDD持久性方面,cache()persist()在spark中有什么区别?

apache-spark distributed-computing rdd
5个回答
209
投票

使用cache(),您只使用默认存储级别MEMORY_ONLY。使用persist(),您可以指定所需的存储级别(rdd-persistence)。

来自官方文档:

  • 您可以使用RDD()或persist()方法标记要保持的cache
  • 每个持久的RDD可以使用不同的storage level存储
  • cache()方法是使用默认存储级别的简写,即StorageLevel.MEMORY_ONLY(在内存中存储反序列化的对象)。

如果要将persist()以外的存储级别分配给MEMORY_ONLYRDD),请使用which storage level to choose


80
投票

cachepersist操作之间的区别纯粹是语法上的。 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计算的优化技术。它们有助于保存临时部分结果,因此可以在后续阶段重复使用。因此,RDDs的这些中间结果保存在内存(默认)或更稳固的存储中,如磁盘和/或复制。可以使用RDD操作缓存caches。它们也可以使用persist操作持久化。

persist, cache

这些功能可用于调整RDD的存储级别。释放内存时,Spark将使用存储级别标识符来决定应保留哪些分区。参数less variants persist()和cache()只是persist(StorageLevel.MEMORY_ONLY).的缩写

警告:更改存储级别后,无法再次更改!

Warning -Cache judiciously... see ((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)

enter image here

Note : Due to the very small and purely syntactic difference between caching and persistence of RDDs the two terms are often used interchangeably.

在这里看得更直观....

坚持内存和磁盘:

enter image description here

Cache

缓存可以在很大程度上提高应用程序的性能。

enter image description here


47
投票

没有区别。来自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()

23
投票

Spark提供5种类型的存储级别

  • MEMORY_ONLY
  • MEMORY_ONLY_SER
  • MEMORY_AND_DISK
  • MEMORY_AND_DISK_SER
  • DISK_ONLY

cache()将使用MEMORY_ONLY。如果你想使用其他东西,请使用persist(StorageLevel.<*type*>)

默认情况下,persist()会将数据作为未序列化的对象存储在JVM堆中。


3
投票

Cache()和persist()这两种方法都用于提高spark计算的性能。这些方法有助于保存中间结果,因此可以在后续阶段重复使用。

cache()和persist()之间的唯一区别是,使用Cache技术我们只能在需要时将中间结果保存在内存中,而在Persist()中我们可以将中间结果保存在5个存储级别(MEMORY_ONLY,MEMORY_AND_DISK,MEMORY_ONLY_SER,MEMORY_AND_DISK_SER, DISK_ONLY)。

© www.soinside.com 2019 - 2024. All rights reserved.