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操作。

persistcache

这些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) 

在这里输入图像

cachepersist操作之间的区别纯粹是句法。 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堆中。