本期內容:數據庫
1,updateStateByKey解密函數
2,mapWithState解密性能
updateStateByKey和mapWithState方法在DStream中找不到,須要進行隱式轉換,轉換爲PairDStreamFunctions對象。對象
updateStateByKey是在已有的狀態下進行更新操做。Seq[V]中存放歷史數據,Option[S]存放新值,可能沒有值。使用了默認的Partitioner函數,HashPartitioner。繼承
StateDStream繼承DStream,使用MEMORY_ONLY_SER的方式做爲存儲級別。接口
StateDStream的compute方法,若是parent存在則調用computeUsingPreviousRDD方法,若是不存在調用preStateRDD的mapPartitions方法。get
computeUsingPreviousRDD方法中,parentRDD和以前的RDD進行cogroup操做,根據Key對Value進行聚合,基於Key對全部的Value進行掃描,當數據量比較少時能夠考慮使用cogroup方法,可是當數據量大時,就會影響整個運行,下降性能。it
mapWithState方法中接收StateSpec類型的參數,StateSpec中封裝了更新操做的函數。io
StateImpl繼承State類,記錄了其狀態信息,定義了獲取,更新,刪除等操做接口,很像是數據庫中的一張表,進行增刪改查。基礎
StateSpecImpl類中定義瞭如何初始化狀態,設置Partition的個數,設置分區函數Partition。
MapWithStateDStreamImpl類的compute方法其實質是調用InternalMapWithStateDStream的getOrCompute方法。
InternalMapWithStateDStream是在歷史數據的基礎上進行更新操做。
InternalMapWithStateDStream的compute方法中,實例化了MapWithStateRDD對象。
MapWithStateRDD類中,一個Partition對應一個MapWithStateRDDRecord。
MapWithStateRDD的compute方法,先獲取以前的State信息,和如今數據的迭代器進行操做,,調用MapWithStateRDDRecord的updateRecordWithData的方法,返回MapWithStateRDDRecord爲元素的迭代器。
newStateMap中保存了整個歷史數據。
RDD是不可變的,可是RDD中的數據能夠變化。