在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)
瞧!
推荐文章
- 缓存和持久化的区别是什么?
- Apache Spark:内核数量vs.执行器数量
- 任务不可序列化:java.io.NotSerializableException,当只对类而不是对象调用闭包外部的函数时
- Spark Java .lang. outofmemoryerror: Java堆空间
- Spark独立集群中的worker、executor和core是什么?
- map和flatMap之间的区别是什么,以及它们各自的良好用例?
- 如何在Spark Dataframe中显示完整的列内容?
- 如何在PySpark中更改数据帧列名?
- Spark中DataFrame、Dataset和RDD的区别
- Spark - repartition() vs coalesce()
- 解释Apache ZooKeeper