Spark分區詳解!DT大數據夢工廠王家林老師親自講解!

Spark分區詳解!DT大數據夢工廠王家林老師親自講解!


http://www.tudou.com/home/_79823675/playlist?qq-pf-to=pcqq.group


一、分片和分區的區別?

分片是從數據角度,分區是從計算的角度,其實都是從大的狀態,split成小的。


二、spark分區理解

rdd作爲一個分佈式的數據集,是分佈在多個worker節點上的。如下圖所示,RDD1有五個分區(partition),他們分佈在了四個worker nodes 上面,RDD2有三個分區,分佈在了三個worker nodes上面。

20049c7cecf2107389107e42881b844e_b.jpg

三、默認分區

一般情況下,是從hdfs文件存儲的block數量作爲分區的大小,但有時候一條記錄誇block,那麼會出現多一個的情況,而且block會略大於或小於128MB。


四、重新分區

想要重新給rdd分區分兩種情況,創建 RDD 時和通過轉換操作得到新 RDD 時。

對於前者,在調用 textFile 和 parallelize 方法時候手動指定分區個數即可。例如 sc.parallelize(Array(1, 2, 3, 5, 6), 2) 指定創建得到的 RDD 分區個數爲 2。


對於後者,直接調用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])



實際上分區的個數是根據轉換操作對應多個 RDD 之間的依賴關係來確定,窄依賴子 RDD 由父 RDD 分區個數決定,例如 map 操作,父 RDD 和子 RDD 分區個數一致;Shuffle 依賴則由分區器(Partitioner)決定,例如 groupByKey(new HashPartitioner(2)) 或者直接 groupByKey(2) 得到的新 RDD 分區個數等於 2。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章