一 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,都應該是整數倍