標籤:分區 spark 分區
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上面。
650) this.width=650;" src="https://pic3.zhimg.com/20049c7cecf2107389107e42881b844e_b.jpg" alt="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。
Spark分區詳解!DT大資料夢工廠王家林老師親自講解!