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


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

使用cache(),你只使用默认的存储级别:

MEMORY_ONLY用于RDD MEMORY_AND_DISK用于数据集

使用persist(),可以为RDD和Dataset指定需要的存储级别。

官方文件显示:

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

使用persist()如果你想分配一个存储级别而不是:

MEMORY_ONLY到RDD 或MEMORY_AND_DISK为数据集

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


缓存和持久化操作之间的区别很简单 语法。缓存是持久化或持久化(MEMORY_ONLY)的同义词。 缓存仅保留默认存储级别MEMORY_ONLY

但是坚持() 我们可以将中间结果保存在5个存储级别。 MEMORY_ONLY MEMORY_AND_DISK MEMORY_ONLY_SER MEMORY_AND_DISK_SER DISK_ONLY


/** *保留该RDD的默认存储级别 (MEMORY_ONLY)。* / Def persist():这个。类型= 坚持(StorageLevel.MEMORY_ONLY) /** *保留该RDD的默认存储级别 (MEMORY_ONLY)。* / Def cache():这个。Type = persist()

在这里查看更多细节…


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

#持续下去,缓存 通过这些功能可以调整RDD的存储级别。 当释放内存时,Spark将使用存储级别标识符来 决定应该保留哪些分区。无参数变量 Persist()和cache()只是 坚持(StorageLevel.MEMORY_ONLY)。

警告:存储级别一旦被更改,就不能再更改!


警告-谨慎缓存…参见((为什么)我们需要调用缓存或持久化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)

注意: 由于rdd的缓存和持久性之间的语法差异非常小,这两个术语通常可以互换使用。

详情请点击这里....

在内存和磁盘中持久化:

缓存:

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


通常,建议使用特定存储级别的持久化来更好地控制缓存行为,而缓存可以作为在内存中缓存数据的一种快速方便的方法。


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)。


耐心:

Same

如果不传递参数,persist()和cache()是相同的,使用默认设置:

当RDD: MEMORY_ONLY 当数据集:MEMORY_AND_DISK

的区别:

与cache()不同,persist()允许你在括号内传递参数,以指定级别:

坚持(MEMORY_ONLY) 坚持(MEMORY_ONLY_SER) 坚持(MEMORY_AND_DISK) 坚持(MEMORY_AND_DISK_SER) 坚持(DISK_ONLY)

瞧!