簡體   English   中英

Spark中分組PairRDD中的最佳分區數

[英]Optimal number of partitions in a grouped PairRDD in Spark

我有兩個結構為 RDD[String, Int] 的 RDD,稱為 rdd1 和 rdd2。

這些 RDD 中的每一個都按其鍵分組,我想對其值執行一個函數(因此我將使用 mapValues 方法)。 方法“GroupByKey”是為每個鍵創建一個新分區還是我必須使用“partitionBy”手動指定它?

我知道如果我不執行更改鍵的操作,RDD 的分區不會改變,所以如果我對每個 RDD 執行 mapValues 操作或者如果我在前兩個 RDD 之間執行連接操作,分區由此產生的 RDD 不會改變。 這是真的嗎?

這里我們有一個代碼示例。 請注意,“函數”沒有定義,因為它在這里並不重要。

val lvl1rdd=rdd1.groupByKey()
val lvl2rdd=rdd2.groupByKey()
val lvl1_lvl2=lvl1rdd.join(lvl2rdd)
val finalrdd=lvl1_lvl2.mapValues(value => function(value))

如果我加入之前的 RDD 並在結果 RDD (mapValues) 的值上執行一個函數,則所有工作都將在單個 worker 中完成,而不是將不同的任務分配到集群的不同 worker 節點上。 我的意思是,所需的行為應該是並行執行作為參數傳遞給 mapValues 方法的函數,該函數在集群允許的多個節點中執行。

1)避免groupByKey操作,因為它們是網絡 I/O 和執行性能的瓶頸。 在這種情況下,更喜歡reduceByKey操作,因為數據 shuffle 相對小於 groupByKey,如果它是一個更大的數據集,我們可以更好地看到差異。

val lvl1rdd = rdd1.reduceByKey(x => function(x)) 
val lvl1rdd = rdd2.reduceByKey(x => function(x))
//perform the Join Operation on these resultant RDD's

在 RDD 上單獨應用函數並加入它們比加入 RDD 並使用 groupByKey() 應用函數要好得多

這也將確保任務在不同的執行程序之間分配並並行執行

參考這個鏈接

2)底層的分區技術是Hash partitioner 如果我們假設我們的數據最初位於n個分區中,那么groupByKey操作將遵循 Hash 機制。

partition = key.hashCode() % numPartitions

這將創建固定數量的分區,當您使用groupByKey操作時,該數量可以大於初始數量。我們還可以自定義要制作的分區。 例如

val result_rdd = rdd1.partitionBy(new HashPartitioner(2))

這將創建 2 個分區,這樣我們就可以設置分區數。 要確定最佳分區數,請參閱此答案https://stackoverflow.com/a/40866286/7449292

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM