Apache Spark 缓存和持久化之间的区别是什么?

wlsrxk51  于 2023-01-31  发布在  Apache
关注(0)|答案(6)|浏览(121)

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

tf7tbtn2

tf7tbtn21#

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

  • MEMORY_ONLY用于RDD
      • 数据集**的MEMORY_AND_DISK

使用persist(),您可以为RDDDataset指定所需的存储级别。
来自官方文件:

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

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

  • MEMORY_ONLYRDD
  • 数据集MEMORY_AND_DISK

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

xghobddn

xghobddn2#

cachepersist操作之间的差异纯粹是语法上的。cache是persist或persist(MEMORY_ONLY)的同义词,即cache仅仅是默认存储级别为MEMORY_ONLYpersist
但是Persist()我们可以将中间结果保存在5个存储级别中。
1.仅内存
1.存储器和磁盘
1.仅存储器SER
1.存储器和磁盘SER
1.仅磁盘
/**使用默认存储级别(MEMORY_ONLY)保留此RDD。/
def持续():此.类型=持久(存储级别.仅内存)
/**使用默认存储级别(MEMORY_ONLY)保留此RDD。/
def缓存():这个.类型= persist()
在此查看更多详细信息...

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

一米十三分一秒,一米十四分一秒

这些函数可以用来调整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)

注:由于RDD的缓存和持久化之间非常小且纯粹的语法差异,这两个术语经常互换使用。
在此处查看更多直观信息....

保留在内存和磁盘中:

缓存:

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

  • 一般情况下,建议对特定存储级别使用persist,以便更好地控制缓存行为,而缓存可以作为在内存中缓存数据的一种快速方便的方式。*
izkcnapc

izkcnapc3#

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

pobjuy324#

Spark提供5种类型的存储级别

  • MEMORY_ONLY
  • MEMORY_ONLY_SER
  • MEMORY_AND_DISK
  • MEMORY_AND_DISK_SER
  • DISK_ONLY

cache()将使用MEMORY_ONLY。如果要使用其他内容,请使用persist(StorageLevel.<*type*>)
默认情况下,persist()将数据作为非序列化对象存储在JVM堆中。

z6psavjg

z6psavjg5#

Cache()和persist()这两个方法都是用来提高spark计算的性能的,它们帮助保存中间结果,以便在后续阶段重用。
cache()和persist()之间的唯一区别是,使用Cache技术,我们可以仅在需要时将中间结果保存在内存中,而在Persistt()中,我们可以将中间结果保存在5个存储级别(MEMORY_ONLY、MEMORY_AND_DISK、MEMORY_ONLY_SER、MEMORY_AND_DISK_SER、DISK_ONLY)中。

7vux5j2d

7vux5j2d6#

对于不耐烦

一样

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

  • RDD:仅内存
  • Dataset:存储器和磁盘

差异:

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

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

瞧!

相关问题