RDD分割槽理解

2021-08-28 17:46:36 字數 1299 閱讀 4784

乙個hdfs檔案的rdd將檔案的每個檔案塊表示為乙個分割槽,並且知道每個檔案塊的位置資訊。這些對應著資料塊的分割槽分布到集群的節點中,因此,分割槽的多少涉及對這個rdd進行平行計算的粒度。首先,分割槽是乙個邏輯概念, 變換前後的新舊分割槽在物理上可能是同一塊記憶體或者是儲存。

需要注意的是,如果沒有指定分割槽數將使用預設值,而預設值是該程式所分配到cpu核數,如果是從hdfs檔案建立,預設為檔案的資料塊數。

在spark形成任務有向無環圖時,會盡可能地把計算分配到靠近資料的位置,減少資料的網路傳輸。當rdd分割槽被快取, 則計算應該被傳送到快取分割槽所在的節點進行,另外,rdd的血統也會影響子rdd的位置,回溯rdd的血統,直到找到具有首選位置屬性的父rdd,並據此決定子rdd的位置。

rdd的依賴分為兩種型別,窄依賴和寬依賴。

窄依賴: 每個父rdd的分割槽都至多被乙個子rdd使用,比如map操作就是典型的窄依賴。

寬依賴: 多個子rdd的分割槽依賴乙個父rdd的分割槽。比如groupbykey都屬於寬依賴。

圖3-4可以看出join操作在不同的情況下可能是寬依賴也可能是窄依賴。

spark中rdd計算是以分割槽為單位的,而且計算函式是在對迭代器復合,不需要保留每次計算的結果。

f 為輸入函式,處理每個分割槽裡面的內容,每個分割槽中的內容以iterator[t]傳遞給輸入函式f, f的輸入結果是iterator[u]. 而最終的rdd將所有分割槽經過輸入函式處理後的結果合併起來。

分割槽的劃分對於shuffle類操作很關鍵,決定了該操作的父rdd和子rdd的依賴型別。比如之前提到的join操作,如果是協同劃分的話,兩個父rdd之間, 父rdd與子rdd之間能形成一致的分割槽安排。即同乙個key保證被對映到同乙個分割槽,這樣就是窄依賴。而如果不是協同劃分,就會形成寬依賴。所謂的協同劃分就是指定分割槽劃分器以產生前後一致的分割槽安排。

spark提供兩種劃分器,hashpartitioner (雜湊分割槽劃分器),(rangepartitioner) 範圍分割槽劃分器. 需要注意的是分割槽劃分器只存在於pairrdd中,普通非(k,v)型別的partitioner為none.

可以用下面這種方式指定分割槽器

其中,4表示groupbykey會有4個分割槽,以hashpartitioner劃分為4個分割槽。

關於RDD分割槽(一)

rdd是彈性分布式資料集,通常rdd很大,會被分成很多個分割槽,分別儲存在不同的節點上,作用有二 增加並行度和減少通訊開銷 連線操作 例如下圖 rdd分割槽原則 rdd分割槽的乙個原則是使得分割槽的個數盡量等於集群中的cpu核心 core 數目 對於不同的spark部署模式而言 本地模式 stand...

RDD的分割槽數

讓rdd的分割槽數盡量和集群的cpu的核數保持一直,這樣可以充分利用cpu的計算資源。開發中為了更加充分的壓榨cpu的計算資源,會把平行度設定為cpu核數的2 3倍 指令碼引數 api引數 檔案本身分塊數.sc.parallelize list 5,6,4,7,3,8,2,9,1,10 partit...

spark 的RDD分割槽

rdd的倆種建立方 1.從集合中建立rdd,spark主要提供了兩種函式 parallelize和makerdd 使用parallelize 從集合建立 scala val rdd sc.parallelize array 1,2,3,4,5,6,7,8 使用makerdd 從集合建立 scala ...