Spark 分區?
什麼是spark分區,怎麼手動分區啊? 希望大家能寫代碼說明一下 謝謝
下面是個人理解:
1. 什麼是分區
RDD 內部的數據集合在邏輯上(以及物理上)被劃分成多個小集合,這樣的每一個小集合被稱為分區。像是下面這圖中,三個 RDD,每個 RDD 內部都有兩個分區。
在源碼級別,RDD 類內存儲一個 Partition 列表。每個 Partition 對象都包含一個 index 成員,通過 RDD 編號 + index 就能從唯一確定分區的 Block 編號,持久化的 RDD 就能通過這個 Block 編號從存儲介質中獲得對應的分區數據。2. 為什麼要分區
分區的個數決定了並行計算的粒度。比如說像是下面圖介個情況,多個分區並行計算,能夠充分利用計算資源。當然實際的情況,因為要考慮 Shuffle 依賴,肯定會比下面這張圖要複雜些。
3. 如何手動分區分兩種情況,創建 RDD 時和通過轉換操作得到新 RDD 時。對於前者,在調用 textFile 和 parallelize 方法時候手動指定分區個數即可。例如 sc.parallelize(Array(1, 2, 3, 5, 6), 2) 指定創建得到的 RDD 分區個數為 2。
對於後者,直接調用 repartition 方法即可。實際上分區的個數是根據轉換操作對應多個 RDD 之間的依賴關係來確定,窄依賴子 RDD 由父 RDD 分區個數決定,例如 map 操作,父 RDD 和子 RDD 分區個數一致;Shuffle 依賴則由分區器(Partitioner)決定,例如 groupByKey(new HashPartitioner(2)) 或者直接 groupByKey(2) 得到的新 RDD 分區個數等於 2。
rdd作為一個分散式的數據集,是分布在多個worker節點上的。如下圖所示,RDD1有五個分區(partition),他們分布在了四個worker nodes 上面,RDD2有三個分區,分布在了三個worker nodes上面。
圖片來自《Spark大數據處理》想要重新給rdd分區,直接調用rdd.repartition方法就可以了,如果想具體控制哪些數據分布在哪些分區上,可以傳一個Ordering進去。比如說,我想要數據隨機地分布成10個分區,可以:class MyOrdering[T] extends Ordering[T]{
def compare(x:T,y:T) = math.random compare math.random
}
// 假設數據是Int類型的
rdd.repartition(10)(new MyOrdering[Int])
hadoop怎麼分區 spark就怎麼分區,通過控制splitsize可以控制分區
強烈建議題主去讀一下Matei關於RDD的論文https://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf,哪裡來的Spark分區這一說法?這個說法本身就是有問題的,是RDD分區,這個基本概念得清楚,不然沒法繼續下去。其次關於如何分區,請參閱官方文檔Spark Programming Guide。
推薦閱讀:
※怎樣理解spark中的partition和block的關係?
※Hadoop、spark、SaaS、PaaS、IaaS、雲計算概念區分?
※第四範式的人工智慧平台 Prophet 有可能替代 Spark 么?
TAG:Spark |