2016-01-17 32 views
1

我正在運行一種迭代算法,在每次迭代中,每個值的列表都被分配一組鍵(1到N)。隨着時間的推移,文件在鍵上的分佈會變得不對稱。我注意到經過幾次迭代,合併階段,似乎RDD的最後幾個分區上的事情似乎開始非常緩慢。最後一個分區上的Spark轉換非常緩慢

我的變換如下:

dataRDD_of_20000_partitions.aggregateByKey(zeroOp)(seqOp, mergeOp) 
    .mapValues(...) 
    .coalesce(1000, true) 
    .collect() 

這裏,在我以前分配的鍵aggregatebykey聚集體(1到N)。我可以合併分區,因爲我知道我需要的分區數量,並將coalesce shuffle設置爲true以平衡分區。

任何人都可以指出一些原因,這些轉換可能導致RDD的最後幾個分區處理緩慢?我想知道這是否與數據偏斜有關。

回答

2

我有一些意見。

  1. 您應該有正確數量的分區以避免數據偏斜。我懷疑你的分區數量少於所需的分區數量。看看這blog

  2. collect()調用,將整個RDD取到單個驅動程序節點中。它可能會導致OutOfMemory幾次。

  3. 變形金剛如aggregateByKey()可能會由於洗牌而導致性能問題。

看一看有關詳細信息,這個問題SE:Spark : Tackle performance intensive commands like collect(), groupByKey(), reduceByKey()