spark核心構件之partitioner

2021-09-10 12:34:47 字數 1106 閱讀 2253

spark 核心思想之一就是資料分割槽,將資料分成很多個part,乙個乙個的進行處理這樣的設定達到了以下的目的。

1、實現分布式

2、可以減少記憶體占用

3、還能方便的做任務重跑

4、而且將統一個key的資料聚集到一起,方便join、group等操作

首先我們來看下partition的定義

trait partition extends serializable

partitioner 故名思意就是確定每條資料應該發往哪個partition的分割槽器,也就是計算partition.index的計算器。

我們來看下定義:

abstract class partitioner extends serializable

是不是又是很簡單,就乙個方法乙個屬性。getpartition這個定義清晰明了,就是傳乙個key進來返回這個key所在的分割槽的idex。

我們來看個實現的例子——最常用的hashpartitioner:

class hashpartitioner(partitions: int) extends partitioner

}

其實就是key的hashcode對分割槽資料取模,是不是easy的不敢相信,spark就是這麼簡單,因為整體設計的巧妙使得每一部分都是那麼的簡單

我們從之前的文章知道spark的執行都是劃分了stage進行執行的,每個stage裡面的task都是可以並行的,每個task處理的分割槽都是不一樣的,思考以下我們就能得到下面的結論,stage裡面每條資料所在的partition肯定都是不會變的,不同的stage之間就可能會不一樣了,所以partitioner起作用的時機肯定是在shuffle的時候咯。

在每個stage完成進行shufflewrite的時候(關於shuffle參考之前的文章)使用partitioner來確定每條資料的去向,下乙個stage開始shuffleread就能通過index拿到對應的資料了,例如進行groupby的候partitioner將相同key的資料發往同乙個分割槽,下乙個stage進行合併就完成了groupby的操作。

spark核心架構

driver部分的 sparkconf sparkcontext driver 部分 val conf new sparkconf val sc new sparkcontext conf end executor部分 分布到集群中的 比如 textfile flatman map worker 管...

Spark核心原理

寬依賴 有shuffle 父rdd的乙個分割槽會被子rdd的多個分割槽所依賴 窄依賴 沒有shuffle 父rdd的乙個分割槽只會被子rdd的1個分割槽所依賴 總結 窄依賴 並行化 容錯 寬依賴 進行階段劃分 shuffle後的階段需要等待shuffle前的階段計算完才能執行 spark的dag 就...

Spark核心RDD foldByKey函式詳解

foldbykey操作作用於rdd k,v 根據k將v做摺疊 合併處理,其中的引數zerovalue表示先根據對映函式將zerovalue應用與v,進行初始化v,在將對映函式應用於初始化後的v。scala val rdd1 sc.makerdd array a 1 a 2 b 1 b 2 c 1 r...