缓存和持久有什么区别?

Ram*_*ana 197 distributed-computing apache-spark rdd

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

aha*_*ars 216

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

来自官方文档:

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

使用StorageLevel.MEMORY_ONLY,如果你要分配的存储级比其他persist()MEMORY_ONLY(选择哪个存储级别)

  • 注意`cache()`现在使用[MEMORY_AND_DISK](http://spark.apache.org/docs/2.3.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame.cache) (14认同)
  • @ximiki ,“MEMORY_AND_DISK”仅是数据集的默认值。`MEMORY_ONLY` 仍然是 RDD 的默认值 (5认同)

Ram*_*ram 82

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

persist, MEMORY_ONLY

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

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

警告-Cache明智地看...((为什么)我们需要调用缓存或在RDD上持久化)

仅仅因为你可以cache在内存中缓存并不意味着你应该盲目地这样做.根据访问数据集的次数以及执行此操作所涉及的工作量,重新计算可能比增加的内存压力所支付的价格更快.

不言而喻,如果你只读一个数据集,一旦没有缓存它,它实际上会使你的工作变慢.可以从Spark Shell中看到缓存数据集的大小.

列出变体......

def cache(): RDD[T]
 def persist(): RDD[T]
 def persist(newLevel: StorageLevel): RDD[T]
Run Code Online (Sandbox Code Playgroud)

*见下面的例子:*

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)
Run Code Online (Sandbox Code Playgroud)

在这里输入图像

persistpersist操作之间的区别纯粹是语法上的.cache是​​persist或persist(cache)的同义词,即 RDDpersist具有默认存储级别cache

注意:由于persist(StorageLevel.MEMORY_ONLY).s的缓存和持久性之间非常小且纯粹的语法差异,这两个术语通常可以互换使用.

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

坚持内存和磁盘:

在此输入图像描述

高速缓存

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

在此输入图像描述


Mik*_*ark 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()
Run Code Online (Sandbox Code Playgroud)


ket*_*nkk 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堆中.


小智 6

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

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


jac*_*ack 5

对于不耐烦的人

\n

相同的

\n

不传递参数persist()cache()是相同的,具有默认设置:

\n
    \n
  • RDD:MEMORY_ONLY
  • \n
  • Dataset:MEMORY_AND_DISK
  • \n
\n

不同之处:

\n

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

\n
    \n
  • persist(MEMORY_ONLY)
  • \n
  • persist(MEMORY_ONLY_SER)
  • \n
  • persist(MEMORY_AND_DISK)
  • \n
  • persist(MEMORY_AND_DISK_SER )
  • \n
  • persist(DISK_ONLY )
  • \n
\n

瞧\xc3\xa0!

\n