sparkstreamming flink區別聯繫

一 spark

1 rdd是通過裝飾者模式形成的一系列函數的依賴關係,可分區、並行;其實不是數據而是計算,只不過通常還是叫數據集。

2 窄依賴是指一個父rdd的partition做多被一個子rdd 的partition引用,獨生子女。

3 application 初始化一個sparkContext即生成一個Application。

job 一個action算子會生成一個job。

stage 寬依賴來確定前後兩個stage, 是一個taskset。

task  一個分區形成一個task。

4 spark 三大數據結構,rdd 廣播變量  累加器

rdd   

累加器(只寫) 不是隻有加法的概念,還有字符串拼接甚至更復雜的邏輯。 自定義累加器可以自己寫累加器定義並且註冊到sparkContext上,基礎累加器類型可以直接由sparkContext來定義即可。

val accumulator : LongAccumulator = sc.longAccumulator
dataRdd.foreach{
  case i =>{
    accumulator.add(i)
  }
}

廣播變量(只讀),用來高效分發較大的對象,向所有工作節點發送一個較大的只讀值,以供一個或者多個spark操作使用。

1)默認方式,它會極大的系統的內存,我們可以假設一個集羣中有1024個task,這個共享變量大小假設爲1M,那麼就會去複製1024份到集羣上去,這樣就會有1個G的數據在網絡中傳輸

2)廣播變量的方式,如果是1024個task需要消耗1G內存,但是如果我們有50個executor來平分這些task,那麼只需要50個副本即可。具體解釋如下:當每一個task需要使用這個變量的時候都會拷貝一份。如果使用廣播變量,首先該廣播變量會拷貝一份副本到Driver中,當每一個executor的task使用到該變量時,首先會去每個executor的BlockManager中去檢查是否有該變量的副本,如果沒有,接着會去Driver中去拷貝一份副本到BlockManager中,然後供該executor中的每一個task使用,到下一個executor的task需要使用這個變量時,它的BlockManager可以去Driver中拷貝副本,也可以去距離比較近的executor的BlockManager中去拷貝。(每一個executor中的BlockManager的作用是負責管理每一個executor對應的內存和磁盤的數據。)

二 sparkstreaming

1 微批處理

2 不同批次之間,只計算自己批次的數據,比如無狀態的算子map flatmap reducebykey groupbykey等

但是可以通過狀態將不同批次數據聯繫起來,比如updateStateByKey, state本質上還是Checkpoint機制來實現的。

舉例如下,計算單詞數量,不同批次的數據可以通過updateStateByKey來維護相同key的單詞的數量,seq這個數組就是本批次相同key的單詞數量的int數組,seq.sum就是計算本批次某個單詞的總的數量。buffer就是狀態維護的目前爲止某個單詞總的數量。

mapDstream.updateStateByKey{
  case(seq, buffer)=>{
    val sum = buffer.getOrElse(0)+seq.sum
    Option(sum)  //更新新的狀態數值
  }
}

3 也有窗口函數,窗口大小最少是streaming設定的批次週期,窗口可以大於批次倍數,但肯定不能小於。

這時候計算的結果如果不用狀態關聯,計算的結果就是窗口時間範圍內的數據,而不是批次內部的數據。

kafkaDStream.window(Seconds(10),Seconds(5));//假設批次爲5s,都應該是整數倍

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章