Spark_4 SparkCore缓存和CheckPoint

缓存

缓存概述

如果在应用程序中多次使用同一个 RDD,可以将该 RDD 缓存在计算节点的内存中,该 RDD 只有在第一次计算的时候会根据血缘关系得到分区的数据,在后续其他地方用到该 RDD 的时候,会直接从缓存处取而不用再根据血缘关系计算,这样就加速后期的重用。在使用完数据之后,要释放缓存,否则会一直在内存中占用资源。
cache在执行的时候也是 lazy 的,需要一个action触发;
但是去除缓存时是eagle的;
cache如果采用默认的机制,数据缓存以后,占的内存会变大
什么时候需要缓存:

  1. 要求的计算速度快,对效率要求高的时候
  2. 集群的资源要足够大,能容得下要被缓存的数据(缓存需要占用内存)
  3. 被缓存的数据会多次的触发Action(多次调用Action类的算子)
  4. 先进行过滤,然后将缩小范围后的数据缓存到内存中

cache()和persist()区别

cache:以默认的存储级别持久化存储RDD (MEMORY_ONLY)
		def cache():this.type = persist() 

persist:
		def persist():this.type=persist(StorageLevel.MEMORY_ONLY)
		/*StorageLevel : 存储级别  
		  StorageLevel中的属性:
				_useDisk: 是否使用磁盘
				_useMemory: 是否使用内存
				_useOffHeap: 是否使用堆外内存
				_deserialized:	 是否反序列化
				_replication: 副本个数*/

cache() 调用 persist()
core 的 cache() 采用的默认存储级别是 :
不使用硬盘,使用内存,不使用堆外,支持反序列化,1副本

在生产上使用:MEMORY_ONLY/MEMORY_ONLY_SER
默认存储使用 MEMORY_ONLY是最好的
如果CPU性能OK,可以使用 MEMORY_ONLY_SER

使用这两者存储级别的原因是:

  1. 生产上为了保证速度,存储级别里只要带DISK的都不要选择,存到DISK里还不如recomputing,所以是不会将缓存的放在 disk 中 ;
  2. Spark本身就有一定的容错机制,所以没有必要使用多副本。

CheckPoint

虽然 RDD 的血缘关系天然地可以实现容错,当 RDD 的某个分区数据失败或丢失,可以通过血缘关系重建。但是对于长时间迭代型应用来说,随着迭代的进行, RDDs 之间的血缘关系会越来越长,一旦在后续迭代过程中出错,则需要通过非常长的血缘关系去重建,势必影响性能。为此, RDD 支持 checkpoint 将数据保存到持久化的存储中,这样就可以切断之前的血缘关系,因为 checkpoint后的RDD 不需要知道它的父RDDs 了,它可以从 checkpoint处拿到数据。
设置checkpoint的目录,可以是本地的文件夹、也可以是HDFS。一般是在具有容错能力,高可靠的文件系统上(比如HDFS, S3等)设置一个检查点路径,用于保存检查点数据。checkPoint减少运行时间的原因:第一次调用检查点的时候,会产生两个executor,两个进程分别是从hdfs读文件和计算(调用的Action类的算子),在第二次调用的时候会发现,运行的时间大大减少,是由于第二次调用算子的时候,不会再从hdfs读文件,而读取的是缓存到的数据,同样是从hdfs上读取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章