缓存和持久有什么区别?

时间:2014-11-11 17:14:16

标签: apache-spark distributed-computing rdd

RDD持久性而言,火花中cache()persist()之间的区别是什么?

6 个答案:

答案 0 :(得分:208)

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

来自官方文档:

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

如果您要将persist()以外的存储级别分配到MEMORY_ONLYwhich storage level to choose

,请使用RDD

答案 1 :(得分:79)

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

  

persistcache

     

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

     

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

警告 - 明智地......看((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

  

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

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

高速缓存

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

enter image description here

答案 2 :(得分:45)

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

答案 3 :(得分:21)

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 :(得分:1)

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

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

答案 5 :(得分:0)

对于不耐烦

相同

在不传递参数的情况下,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 )

Voilà!