博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大数据入门:Spark持久化存储策略
阅读量:4073 次
发布时间:2019-05-25

本文共 1777 字,大约阅读时间需要 5 分钟。

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

转载地址:http://ihkni.baihongyu.com/

你可能感兴趣的文章
搞定Java面试中的数据结构问题
查看>>
React Native(一):搭建开发环境、出Hello World
查看>>
React Native(二):属性、状态
查看>>
JSX使用总结
查看>>
React Native(四):布局(使用Flexbox)
查看>>
React Native(七):Android双击Back键退出应用
查看>>
Android自定义apk名称、版本号自增
查看>>
【剑指offer】q50:树中结点的最近祖先
查看>>
二叉树的非递归遍历
查看>>
【leetcode】Reorder List (python)
查看>>
【leetcode】Linked List Cycle (python)
查看>>
【leetcode】Candy(python)
查看>>
【leetcode】Sum Root to leaf Numbers
查看>>
【leetcode】Pascal's Triangle II (python)
查看>>
如何成为编程高手
查看>>
本科生的编程水平到底有多高
查看>>
Solr及Spring-Data-Solr入门学习
查看>>
python_time模块
查看>>
python_configparser(解析ini)
查看>>
selenium学习资料
查看>>