caching和持久性有什么区别?
就RDD
持久性而言,spark cache()
和persist()
在spark中有什么区别?
使用cache()
,您只使用默认存储级别MEMORY_ONLY
。 用persist()
,你可以指定你想要的存储级别( rdd-persistence )。
如果要将另一个存储级别( 而不是MEMORY_ONLY
persist()
分配给RDD
( select哪个存储级别 persist()
,请使用persist()
)
caching或持久性是(迭代和交互式)Spark计算的优化技术。 他们帮助保存临时的部分结果,以便在后续阶段可以重复使用。 这些RDD
的临时结果因此保存在内存(默认)或更坚实的存储如磁盘和/或复制。 RDD
可以使用cache
操作进行cache
。 他们也可以坚持使用persist
操作。
persist
,cache
这些function可以用来调整
RDD
的存储级别。 释放内存时,Spark将使用存储级别标识符来决定应保留哪些分区。 参数less变体persist
()和cache
()只是persist(StorageLevel.MEMORY_ONLY).
缩写persist(StorageLevel.MEMORY_ONLY).
警告 :存储级别更改后,不能再次更改!
警告-Cache明智地…看( (为什么)我们需要调用caching或坚持RDD )
仅仅因为你可以在存储器中cachingRDD
并不意味着你应该盲目地这样做。 取决于访问数据集的次数以及这样做所涉及的工作量,重新计算可以比由增加的内存压力支付的价格更快。
不用说,如果你只读过一个数据集,就没有必要caching数据集,这实际上会让你的工作变慢。 从Spark Shell中可以看到caching数据集的大小。
列出变体…
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)
cache
和persist
操作之间的区别纯粹是句法。 caching是persist或persist(MEMORY_ONLY
)的同义词,即cache
仅仅persist
默认存储级别MEMORY_ONLY
注意:由于RDD
的高速caching和持久性之间的非常小且纯粹的句法差异,两个术语经常互换使用。
这里看到更多的视觉….
坚持内存和磁盘:
高速caching
caching可以在很大程度上提高应用程序的性能。 资源
没有区别。 来自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()
Spark提供5种types的存储级别
-
MEMORY_ONLY
-
MEMORY_ONLY_SER
-
MEMORY_AND_DISK
-
MEMORY_AND_DISK_SER
-
DISK_ONLY
cache()
将使用MEMORY_ONLY
。 如果你想使用别的东西,请使用persist(StorageLevel.<*type*>)
。
默认情况下persist()
会将数据作为反序列化的对象存储在JVM堆中。