Spark Streaming揭秘 Day14 State状态管理
Spark Streaming揭秘 Day14
State状态管理
今天让我们进入下SparkStreaming的一个非常好用的功能,也就State相关的操作。State是SparkStreaming中用来管理历史数据的结构。目前主要提供了updateStateByKey和MapWithStateRDD两个方法。
updateStateByKey
首先,让我们先找一下这个方法的位置。
我们可以发现updateStateByKey这个方法并不在DStream中,而是在PairDStreamFunctions中。

为什么在不同类中的方法可以组合起来,这个就不得不提一下scala中非常厉害的隐式转换特性,在如下部分,希望大家能深入研究下。

从方法的位置,我们可以很明确的知道这个方法必须是针对keyValue结构的。
进入到方法内部,我们首先看到其使用到了defaultPartitoner,默认是采用HashPartitioner,特点是效率高。

下面进入计算的关键代码,也就是StateDStream中的compute方法。

从上述的计算逻辑中,我们会发现一个明显的弱点:其核心逻辑是一个cogroup,具体来说是在每次计算时,都按照key对所有数据进行扫描和集合。好处是逻辑简单,坏处是有性能问题,每次多要全部重新扫描下,随着数据量越来越大,性能会越来越低,所以不能常使用。
所以这个方法主要针对小数据集的处理方法,关于这个效率问题有没有解决方法,我们看看下一个方法。
mapWithState
这个方法在目前还是试验状态,有可能不稳定,但其设计理念让人眼前一亮,让我们先看一下方法说明。

可以看到,在方法中,对state提供了增删改查等操作,也就是,可以把state与一个keyValue内存数据表等价。具体是如何实现的呢?
首先,进入方法定义,可以看到在操作时把存储级别定为了内存存储,这个和前面内存表的推断一致。

进一步深入,发现,每个partition被一个MapWithStateRDDRecord代表,在计算时调用了如下框出的方法。

对于updateRecordWithData这个方法,主要分为了两个步骤:
步骤一:内存表newStateMap建立,主要是采用copy方法,建立一张已纳入历史数据的内存表。

步骤二:根据当前Batch的数据进行计算,并更新newStateMap的数据,

从这个计算逻辑我们可以看,相比于第一个方法updateStateByKey,mapWithState的操作是增量的!!!这个效率会高很多。
进一步讲,mapWithState方法给我们上了生动的一课。说明通过封装,在partition不变的情况下,实现了对RDD内部数据的更新。
也就是说,对于Spark来说,不可变的RDD也可以处理变化的数据!!!
欲知后事如何,且听下回分解
DT大数据每天晚上20:00YY频道现场授课频道68917580
Spark Streaming揭秘 Day14 State状态管理的更多相关文章
- Spark Streaming揭秘 Day13 数据安全容错(Driver篇)
Spark Streaming揭秘 Day13 数据安全容错(Driver篇) 书接上回,首先我们要考虑的是在Driver层面,有哪些东西需要维持状态,只有在需要维持状态的情况下才需要容错,总的来说, ...
- Spark Streaming揭秘 Day33 checkpoint的使用
Spark Streaming揭秘 Day33 checkpoint的使用 今天谈下sparkstreaming中,另外一个至关重要的内容Checkpoint. 首先,我们会看下checkpoint的 ...
- Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解
Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是Jo ...
- Spark Streaming揭秘 Day19 架构设计和运行机制
Spark Streaming揭秘 Day19 架构设计和运行机制 今天主要讨论一些SparkStreaming设计的关键点,也算做个小结. DStream设计 首先我们可以进行一个简单的理解:DSt ...
- Spark Streaming揭秘 Day6 关于SparkStreaming Job的一些思考
Spark Streaming揭秘 Day6 关于SparkStreaming Job的一些思考 Job是SparkStreaming的重要基础,今天让我们深入,进行一些思考. Job是什么? 首先, ...
- Spark Streaming揭秘 Day5 初步贯通源码
Spark Streaming揭秘 Day5 初步贯通源码 引子 今天,让我们从Spark Streaming最重要的三个环节出发,让我们通过走读,逐步贯通源码,还记得Day1提到的三个谜团么,让我们 ...
- Spark Streaming揭秘 Day4-事务一致性(Exactly one)
Spark Streaming揭秘 Day4 事务一致性Exactly one 引子 对于业务处理系统,事务的一致性非常的关键,事务一致性(Exactly one),简单来说,就是输入数据一定会被处理 ...
- Spark Streaming揭秘 Day35 Spark core思考
Spark Streaming揭秘 Day35 Spark core思考 Spark上的子框架,都是后来加上去的.都是在Spark core上完成的,所有框架一切的实现最终还是由Spark core来 ...
- Spark Streaming揭秘 Day32 WAL框架及实现
Spark Streaming揭秘 Day32 WAL框架及实现 今天会聚焦于SparkStreaming中非常重要的数据安全机制WAL(预写日志). 设计要点 从本质点说,WAL框架是一个存储系统, ...
随机推荐
- Mac 开发者的十八般兵器:重温 10 篇热文
<开发者 MAC 电脑里的十八般兵器> 古人常以刀.枪.剑.戟.斧.钺.铲.叉.鞭.锏.锤.戈.镋.棍.槊.棒.矛.钯十八种兵器,样样精通,来形容一个人的武学技能get状态.在开发者的世界 ...
- Scheme中一些函数在C++里面的实现与吐槽
最终我失败了,这是显而意见,我试图在一个很看重类型是什么的语言中实现无类型操作,事实上,哪怕我实现了基本的cons,car,cdr,list后面的代码也无法写下去.比如说list-n,根据 ...
- python(6)- shelve模块
前面学习了pickle,这两个可以将数据持久化存储到硬盘上,在实际应用中,我们可能会多次将数据dump到同一文件里,试一下: import pickle data = {'k1':123, 'k2': ...
- POJ 3074 Sudoku (DLX)
Sudoku Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- [改善Java代码]不要让四舍五入亏了一方
建议25: 不要让四舍五入亏了一方 本建议还是来重温一个小学数学问题:四舍五入.四舍五入是一种近似精确的计算方法,在Java 5之前,我们一般是通过使用Math.round来获得指定精度的整数或小数的 ...
- JVM 垃圾回收 Minor gc vs Major gc vs Full gc
关于垃圾回收机制及比较请参见:http://colobu.com/2015/04/07/minor-gc-vs-major-gc-vs-full-gc/ http://colobu.com/2014/ ...
- java-分页之页面分页
import java.util.ArrayList; import java.util.List; /** * * @author cheney * * @date Aug 31, 2012 */ ...
- framework7学习笔记
最近因项目需要学习framework7,简称F7.对于自己遇到的问题和学习到的东西做个简单记录. 问题:刚开始获取json,页面上一直不显示,不得其法,原来是json文件需要在弹出层打开之后在来加载, ...
- C#几个经常犯错误汇总
在我们平常编程中,时间久了有时候会形成一种习惯性的思维方式,形成固有的编程风格,但是有些地方是需要斟酌的,即使是一个很小的错误也可能会导致昂贵的代价,要学会善于总结,从错误中汲取教训,尽量不再犯同样错 ...
- 软件包 java.util 的分层结构
概述 软件包 类 使用 树 已过时 索引 帮助 JavaTM Platform Standard Ed. 6 上一个 下一个 框架 无框架 所有类 ...