缓存和持久性有什么区别?


Answers:


222

使用时cache(),仅使用默认存储级别:

  • MEMORY_ONLY对于RDD
  • MEMORY_AND_DISK用于数据集

使用persist(),您可以为RDD数据集指定所需的存储级别。

从官方文档:

  • 您可以RDD使用persist()或cache()方法将其标记为要保留。
  • 每个持久化RDD可以使用不同的存储storage level
  • cache()方法是用于使用所述默认存储水平,这是一个速记StorageLevel.MEMORY_ONLY(存储在反序列化存储器对象)。

persist()如果您要分配以下存储级别,请使用:

  • MEMORY_ONLYRDD
  • MEMORY_AND_DISK用于数据集

官方文档的有趣链接:选择哪种存储级别


17
请注意,cache()现在使用MEMORY_AND_DISK
ximiki

我认为以上评论不正确。阅读最新的官方文档,使用链接ahars,可以与最后一个要点保持一致。cache()方法是使用默认存储级别StorageLevel.MEMORY_ONLY(将反序列化的对象存储在内存中)的简写。
user2596560

1
@ximiki MEMORY_AND_DISK是仅数据集的默认值。MEMORY_ONLY仍然是RDD的默认值
更改

1
@ user2596560注释对于数据集的默认缓存值是正确的。您适合仍保留MEMORY_ONLY默认值的RDD
更改

83

cachepersist运算之间的区别纯粹是语法上的。缓存是persist或persist(MEMORY_ONLY)的同义词,即 cachepersist具有默认存储级别MEMORY_ONLY


/ ** *使用默认存储级别(MEMORY_ONLY)保留此RDD 。* /
defpersist():this.type =持久(StorageLevel.MEMORY_ONLY)

/ ** *使用默认存储级别(MEMORY_ONLY)保留此RDD 。* /
def cache():this.type =持久性()

在这里查看更多详细信息...


缓存或持久性是用于(迭代和交互式)Spark计算的优化技术。它们有助于保存临时的部分结果,以便可以在后续阶段中重复使用。因此,这些临时结果RDDs被保存在内存中(默认值)或更多固态存储(如磁盘)和/或已复制。 RDD可以使用cache操作进行缓存。也可以使用persist操作将其保留。

persistcache

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

警告:一旦更改了存储级别,便无法再次更改!

警告-明智地缓存 ...请参阅((为什么)我们需要调用缓存或在RDD上持久保存

仅仅因为您可以RDD在内存中缓存a 并不意味着您应该盲目地这样做。根据访问数据集的次数以及这样做所涉及的工作量,重新计算的速度可能快于增加的内存压力所付出的代价。

不用说,如果仅在没有意义进行缓存时才读取数据集,则实际上会使您的工作变慢。可以从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)

在此处输入图片

注意:由于RDDs的缓存和持久性之间的语法差异非常小,而且纯粹是语法上的区别,因此这两个术语通常可以互换使用。

在此处查看更多内容...。

保留在内存和磁盘中:

在此处输入图片说明

快取

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

在此处输入图片说明


我在一个块内有一个DF。如何访问它。
Bindumalini KK

48

没有区别。来自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堆中。


4

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.