Spark DStreams缓存或持久化

2018年05月19日 10:19 | 2636次浏览 作者原创 版权保护

和RDD相似,DStreams也允许开发者持久化流数据到内存中。在DStream上使用persist()方法可以自动地持久化DStream中的RDD到内存中。如果DStream中的数据需要计算多次,这是非常有用的。像reduceByWindow和reduceByKeyAndWindow这种窗口操作、updateStateByKey这种基于状态的操作,持久化是默认的,不需要开发者调用persist()方法。

例如通过网络(如kafka,flume等)获取的输入数据流,默认的持久化策略是复制数据到两个不同的节点以容错。

注意,与RDD不同的是,DStreams默认持久化级别是存储序列化数据到内存中,这将在性能调优章节介绍。更多的信息请看rdd持久化


1、惰性求值: 

RDD转化过程都是惰性求值的。这意味着在被调用行动操作之前Spark不会开始计算,spark会在内部记录下所要求执行的操作的相关信息,我们可以把每个RDD看作我们通过转化操作构建出来的、记录如何计算数据的指定列表。把数据读取到RDD的操作同样是惰性的。


2、持久化缓存 

SparkRDD是惰性求值的,而有时候我们希望能够多次使用同一个RDD。如果简单地对RDD调用行动操作,Spark每次都会重算RDD以及它的所有依赖。这在迭代算法中消耗很大。 

此时我们可以让spark对数据进行持久化操作。当我们让Spark持久化存储一个RDD时,计算出的RDD节点会分别保存它们所求出的RDD分区数据。如果一个有持久化数据的节点发生故障,Spark会在需要用到缓存数据时重算丢失的数据分区。我们可以把我们的数据备份到多个节点避免这种情况发生。


注意:序列化是执行上面的基础。

val result = input.map { x => x * x      result.persist(StorageLevel.DISK_ONLY)      println(result.count())
println(result.collect.mkString(","))

Spark还有一个unpersist()方法,调用该方法可以手动把持久化RDD从缓存中移除。



小说《我是全球混乱的源头》
此文章本站原创,地址 https://www.vxzsk.com/950.html   转载请注明出处!谢谢!

感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程


上一篇:缓存扩展 下一篇:Spark Streaming checkpoint
^