持久化存储是Spark非常重要的一个特性,通过持久化存储,提升Spark应用性能,以更好地满足实际需求。而Spark的持久化存储,根据不同的需求现状,可以选择不同的策略方案。今天的大数据入门分享,我们就来具体讲讲Spark持久化存储策略。
所谓的Spark持久化存储,就是将一个RDD持久化到内存或磁盘中,以便重用该RDD,省去重新计算的环节,以空间换时间。RDD持久化,是一个分布式的过程,其内部的每个Partition各自缓存到所在的计算节点上,根据复用的需求再来读取。
RDD持久化
在Spark中,RDD采用惰性求值的机制,每次遇到action操作,都会从头开始执行计算。每次调用action操作,都会触发一次从头开始的计算。这样的执行流程,不免遇到重复计算,理论上来说造成了计算过程当中更多资源的占用,持久化机制就是避免重复计算带来的开销而设计的。
Spark提供了persist和cache两个持久化函数,其中cache将RDD持久化到内存中,而persist则支持多种存储级别。两个持久化方法的主要区别是:cache()方法默认使用的是内存级别,其底层调用的是persist()方法。
RDD持久化存储级别
Spark的提供了多种持久化级别,比如内存、磁盘、内存 磁盘等。具体来说,包括以下几种:
MEMORY_ONLY
默认,表示将RDD作为反序列化的Java对象存储于JVM中,如果内存不够用,则部分分区不会被持久化,等到使用到这些分区时,会重新计算。
MEMORY_AND_DISK
将RDD作为反序列化的Java对象存储在JVM中,如果内存不足,超出的分区将会被存放在硬盘上。
MEMORY_ONLY_SER
将RDD序列化为Java对象进行持久化,每个分区对应一个字节数组。此方式比反序列化要节省空间,但是会占用更多CPU资源。
MEMORY_AND_DISK_SER
与MEMORY_ONLY_SER类似,如果内存放不下,则溢写到磁盘。
DISK_ONLY
将RDD的分区数据存储到磁盘。
MEMORY_ONLY_2,MEMORY_AND_DISK_2
与上面的方式类似,但是会将分区数据复制到两个集群,
OFF_HEAP(experimental)
与MEMORY_ONLY_SER类似,将数据存储到堆外内存off-heap,需要将off-heap开启。
RDD的Checkpoint机制
除了cache和persist之外,Spark还提供了另外一种持久化:checkpoint,它能将RDD写入分布式文件系统,提供类似于数据库快照的功能。
它提供了一种相对而言更加可靠的数据持久化方式,把数据保存在分布式文件系统,比如HDFS上。这里就是利用了HDFS高可用性,高容错性(多副本)来最大程度保证数据的安全性。
DStream持久化
除了RDD持久化的使用方式,其实DStream也是支持持久化的,同样是使用persist()与cache()方法。
持久化通常在有状态的算子中使用,比如窗口操作,默认情况下,虽然没有显性地调用持久化方法,但是底层已经帮用户做了持久化操作。与RDD的持久化不同,DStream的默认持久性级别将数据序列化在内存中。
如何选择RDD持久化策略
Spark提供的多种持久化级别,主要是为了在CPU和内存消耗之间进行取舍,可以根据实际情况来选择持久化级别。这里也给大家一些持久化存储策略选择的建议——
优先使用MEMORY_ONLY,如果可以缓存所有数据的话,那么就使用这种策略。因为纯内存速度最快,而且没有序列化,不需要消耗CPU进行反序列化操作。
如果MEMORY_ONLY策略,无法存储的下所有数据的话,那么使用MEMORY_ONLY_SER,将数据进行序列化进行存储,纯内存操作还是非常快,只是要消耗CPU进行反序列化。
如果需要进行快速的失败恢复,那么就选择带后缀为_2的策略,进行数据的备份,这样在失败时,就不需要重新计算了。
能不使用DISK相关的策略,就不用使用,有的时候,从磁盘读取数据,还不如重新计算一次。
关于大数据入门,Spark持久化存储策略,以上就为大家做了具体的讲解了。Spark的持久化存储策略,总体来说就是为减少开销、提升性能而设计的,如何选择也需要结合实际来看。