spark的三大核心資料結構:rdd、累加器(只寫不讀)、廣播變數(唯讀不寫)
廣播變數用來高效分發較大的物件。向所有工作節點傳送乙個較大的唯讀值,以供乙個或多個spark操作使用。
不用廣播變數的話,轉換運算元和執行運算元之間會有shuffle的過程;
使用廣播變數的好處是避免了rdd轉換和行動中的shuffle的落盤和磁碟io,提高效能,是spark的一種優化手段。
廣播變數原理是將rdd封裝成廣播變數,存放在記憶體中;其餘的rdd與這個rdd資料進行互動的時候,就是在記憶體中相互動,只做map操作,效率得到很大的提高。
scala> val rdd1 = sc.makerdd(array((1,"a"),(2,"b")))
rdd1: org.apache.spark.rdd.rdd[(int, string)] = parallelcollectionrdd[2] at makerdd at :24
scala> val rdd2 = sc.makerdd(array((1,"a"),(2,"bb"),(3,"cc")))
rdd2: org.apache.spark.rdd.rdd[(int, string)] = parallelcollectionrdd[3] at makerdd at :24
scala> rdd1.join(rdd2).collect
res1: array[(int, (string, string))] = array((1,(a,a)), (2,(b,bb)))
用時如下0.5s:
sc.broadcast建立廣播變數,變數.value獲取廣播變數的值
但是由於廣播變數是傳入每個worker工作節點中,所以廣播變數記憶體不宜過大,否則會造成worker節點的executor記憶體不足
scala> val rdd2 = sc.makerdd(array((1,"a"),(2,"bb"),(3,"cc")))
rdd2: org.apache.spark.rdd.rdd[(int, string)] = parallelcollectionrdd[3] at makerdd at :24
scala> val bc = sc.broadcast(array((1,"a"),(2,"bb")))
bc: org.apache.spark.broadcast.broadcast[array[(int, string)]] = broadcast(3)
scala> rdd2.map(item=>).collect
res2: array[(int, string)] = array((1,a), (2,bb), (3,cc))
用時44ms:
相比不使用廣播變數,效能得到了很大的提高。
核心資料結構
關於開發驅動重要的核心資料結構,方便自己理解 driver object typedef struct driver object cshort type cshort size 乙個鍊錶,記錄了該驅動建立的所有裝置物件 pdevice object deiceobject ulong flags ...
核心資料結構
核心需要儲存i o元件使用的狀態資訊,可以通過若干核心資料結構比如說檔案開啟表等來完成 unix系統中在讀取乙個使用者檔案的時候,核心需要去檢查下快取,然後再去決定是否執行磁碟i o,在讀乙個程序映象時候,核心只需要從記憶體當中讀取資料,也就是說這些操作都可以呼叫read 函式來完成,但是語義不同 ...
核心資料結構
這部分包含了修改核心模組,所以要使用到核心鏈結表資料結構。首先你得定義乙個包含元素的結構去插入鍊錶。下邊這段 用c語言定義了生日結構 struct birthday 注意struct list head list。結構list head在包含目錄的裡有定義。它的作用就是嵌入包含列表節點的鏈結表。li...