224

在持久性方面, spark和inRDD之间有什么区别?cache()persist()

4

6 回答 6

240

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

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

使用persist(),您可以为RDDDataset指定您想要的存储级别。

来自官方文档:

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

persist()如果您想分配除以下之外的存储级别,请使用:

  • MEMORY_ONLYRDD
  • MEMORY_AND_DISK用于数据集

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

于 2014-11-12T08:42:52.653 回答
94

cachepersist操作之间的区别纯粹是句法。cache 是persist 或persist( MEMORY_ONLY) 的同义词,即 cachepersist具有默认存储级别MEMORY_ONLY

但是Persist() 我们可以将中间结果保存在 5 个存储级别中。

  1. MEMORY_ONLY
  2. MEMORY_AND_DISK
  3. MEMORY_ONLY_SER
  4. MEMORY_AND_DISK_SER
  5. DISK_ONLY

MEMORY_ONLY/** * 以默认存储级别 ( )持久化此 RDD 。*/
def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)

MEMORY_ONLY/** * 以默认存储级别 ( )持久化此 RDD 。*/
def cache(): this.type = persist()

在此处查看更多详细信息...


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

# persist,cache

这些函数可用于调整RDD. 在释放内存时,Spark 将使用存储级别标识符来决定应该保留哪些分区。参数少变体 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 的缓存和持久性之间的非常小的和纯粹的语法差异,这两个术语经常互换使用。

在这里查看更多视觉效果......

持久化内存和磁盘:

在此处输入图像描述

缓存

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

在此处输入图像描述

于 2016-08-09T09:42:17.107 回答
50

没有区别。从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()
于 2014-11-11T19:13:04.113 回答
26

Spark 提供了 5 种存储级别

  • MEMORY_ONLY
  • MEMORY_ONLY_SER
  • MEMORY_AND_DISK
  • MEMORY_AND_DISK_SER
  • DISK_ONLY

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

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

于 2017-04-05T12:59:46.587 回答
6

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

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

于 2019-04-09T06:37:52.167 回答
3

对于不耐烦

相同的

不传递参数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 )

瞧!

于 2020-11-04T20:24:24.343 回答