• Spark Streaming揭秘 Day14 State状态管理


    Spark Streaming揭秘 Day14

    State状态管理

    今天让我们进入下SparkStreaming的一个非常好用的功能,也就State相关的操作。State是SparkStreaming中用来管理历史数据的结构。目前主要提供了updateStateByKey和MapWithStateRDD两个方法。

    updateStateByKey

    首先,让我们先找一下这个方法的位置。

    我们可以发现updateStateByKey这个方法并不在DStream中,而是在PairDStreamFunctions中。

    Snip20160526_10

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

    Snip20160526_11

    从方法的位置,我们可以很明确的知道这个方法必须是针对keyValue结构的。

    进入到方法内部,我们首先看到其使用到了defaultPartitoner,默认是采用HashPartitioner,特点是效率高。

    Snip20160526_13

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

    Snip20160526_15

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

    mapWithState

    这个方法在目前还是试验状态,有可能不稳定,但其设计理念让人眼前一亮,让我们先看一下方法说明。
    Snip20160526_16

    可以看到,在方法中,对state提供了增删改查等操作,也就是,可以把state与一个keyValue内存数据表等价。具体是如何实现的呢?

    首先,进入方法定义,可以看到在操作时把存储级别定为了内存存储,这个和前面内存表的推断一致。
    Snip20160526_17

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

    对于updateRecordWithData这个方法,主要分为了两个步骤:

    步骤一:内存表newStateMap建立,主要是采用copy方法,建立一张已纳入历史数据的内存表。
    Snip20160526_20

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

    从这个计算逻辑我们可以看,相比于第一个方法updateStateByKey,mapWithState的操作是增量的!!!这个效率会高很多。

    进一步讲,mapWithState方法给我们上了生动的一课。说明通过封装,在partition不变的情况下,实现了对RDD内部数据的更新。
    也就是说,对于Spark来说,不可变的RDD也可以处理变化的数据!!!

    欲知后事如何,且听下回分解

    DT大数据每天晚上20:00YY频道现场授课频道68917580

  • 相关阅读:
    Python基本数据统计(二)---- 数据选择 & 简单统计与处理
    python2.7无法使用上下左右和backspace
    Python基本数据统计(一)---- 便捷数据获取 & 数据准备和整理 & 数据显示
    CentOS 6.5下安装NumPy、SciPy、Scikit-Learn
    hihocoder 1296 数论三·约瑟夫问题
    The 13th Zhejiang Provincial Collegiate Programming Contest
    hihocoder1181 欧拉路
    UPCOJ2985 Gopher(二分匹配)
    HNU13377 Book Club(二分匹配)
    HDU4799 LIKE vs CANDLE(树形dp)
  • 原文地址:https://www.cnblogs.com/dt-zhw/p/5532845.html
Copyright © 2020-2023  润新知