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状态管理的更多相关文章

  1. Spark Streaming揭秘 Day13 数据安全容错(Driver篇)

    Spark Streaming揭秘 Day13 数据安全容错(Driver篇) 书接上回,首先我们要考虑的是在Driver层面,有哪些东西需要维持状态,只有在需要维持状态的情况下才需要容错,总的来说, ...

  2. Spark Streaming揭秘 Day33 checkpoint的使用

    Spark Streaming揭秘 Day33 checkpoint的使用 今天谈下sparkstreaming中,另外一个至关重要的内容Checkpoint. 首先,我们会看下checkpoint的 ...

  3. Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解

    Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是Jo ...

  4. Spark Streaming揭秘 Day19 架构设计和运行机制

    Spark Streaming揭秘 Day19 架构设计和运行机制 今天主要讨论一些SparkStreaming设计的关键点,也算做个小结. DStream设计 首先我们可以进行一个简单的理解:DSt ...

  5. Spark Streaming揭秘 Day6 关于SparkStreaming Job的一些思考

    Spark Streaming揭秘 Day6 关于SparkStreaming Job的一些思考 Job是SparkStreaming的重要基础,今天让我们深入,进行一些思考. Job是什么? 首先, ...

  6. Spark Streaming揭秘 Day5 初步贯通源码

    Spark Streaming揭秘 Day5 初步贯通源码 引子 今天,让我们从Spark Streaming最重要的三个环节出发,让我们通过走读,逐步贯通源码,还记得Day1提到的三个谜团么,让我们 ...

  7. Spark Streaming揭秘 Day4-事务一致性(Exactly one)

    Spark Streaming揭秘 Day4 事务一致性Exactly one 引子 对于业务处理系统,事务的一致性非常的关键,事务一致性(Exactly one),简单来说,就是输入数据一定会被处理 ...

  8. Spark Streaming揭秘 Day35 Spark core思考

    Spark Streaming揭秘 Day35 Spark core思考 Spark上的子框架,都是后来加上去的.都是在Spark core上完成的,所有框架一切的实现最终还是由Spark core来 ...

  9. Spark Streaming揭秘 Day32 WAL框架及实现

    Spark Streaming揭秘 Day32 WAL框架及实现 今天会聚焦于SparkStreaming中非常重要的数据安全机制WAL(预写日志). 设计要点 从本质点说,WAL框架是一个存储系统, ...

随机推荐

  1. cocos2d-x3.x使用rapidjson

    rapidjson效率高,所以之前cocostudio里面解析用的jsoncpp也换成了rapidjson. 引擎又带有rapidjson库,所以不用单独去下载,直接就可以用. 这里主要写一下关于解析 ...

  2. 3d ListView翻译

    作为一个刚毕业的大学生,我要提醒自己时时刻刻要学习. 最近做listview看到很久以前的一个demo,高手如云啊,我们就只有好好加油了. 这是索尼公司的一个员工写的学习博客,由于本人英文能力有限是按 ...

  3. java中的静态方法

    静态方法是属于类的,内存必须为它分配内存空间,这个空间一直由静态方法占用,内存管理器不会由于静态方法没有被调用而将静态方法的存储空间收回,这样如果将所有的方法都声明为静态方法,就会占用大量的内存空间, ...

  4. 关于Eclipse的工作空间设置默认个数和配置

    &

  5. 利用SCI做的一个足球答题系统

    SCI,异步串行通信接口,内置独立的波特率产生电路和SCI收发器,可以选择发送8或9个数据位(其中一位可以指定为奇或偶校验位). SCI是全双工异步串行通信接口,主要用于MCU与其他计算机或设备之间的 ...

  6. Android之Android studio安装

    首先下载jdk:http://www.oracle.com/technetwork/java/javase/downloads/index.html 然后下载Android SDK:http://ww ...

  7. C#算法基础之冒泡排序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. UpdatePanel中执行js

    在UpdatePanel中,直接使用Page.ClientScript.RegisterStartupScript的方式执行javascript,会导致无法执行.原因可能是因为RegisterStar ...

  9. HDOJ2022海选女主角

    海选女主角 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  10. Cocos2d-x中Vector<T>容器以及实例介绍

    Vector<T> 是Cocos2d-x 3.x推出的列表容器,因此它所能容纳的是Ref及子类所创建的对象指针,其中的T是模板,表示能够放入到容器中的类型,在Cocos2d-x 3.x中T ...