美文网首页
大数据入门:Spark持久化存储策略

大数据入门:Spark持久化存储策略

作者: 成都加米谷大数据 | 来源:发表于2020-12-14 17:26 被阅读0次

持久化存储是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的持久化存储策略,总体来说就是为减少开销、提升性能而设计的,如何选择也需要结合实际来看。

相关文章

网友评论

      本文标题:大数据入门:Spark持久化存储策略

      本文链接:https://www.haomeiwen.com/subject/lftbgktx.html