Spark 分區?
什麼是spark分區,怎麼手動分區啊? 希望大家能寫代碼說明一下 謝謝
下面是個人理解:
1. 什麼是分區
RDD 內部的數據集合在邏輯上(以及物理上)被劃分成多個小集合,這樣的每一個小集合被稱為分區。像是下面這圖中,三個 RDD,每個 RDD 內部都有兩個分區。

2. 為什麼要分區
分區的個數決定了並行計算的粒度。比如說像是下面圖介個情況,多個分區並行計算,能夠充分利用計算資源。當然實際的情況,因為要考慮 Shuffle 依賴,肯定會比下面這張圖要複雜些。

對於前者,在調用 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上面。

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 |
