是的,相同的key是會發到同一個reduce處理。如果相同的key對應的value量級太大確實會導致這個reduce很慢。如果其他的reduce要處理的資料相對較少,就會出現資料傾斜。 資料傾斜一般是指某一個partitioner的處理的資料量遠大於其他的partitioner,這個在分散式系統中很常見。一般有兩種原因:(1)partition演算法不夠隨機,這種情況比較少見,換相對隨機的演算法就可以。(2)某個key對應的資料非常多,而這個key對應的資料又必須傳送到同一個partitioner進行處理。 對於第二種資料傾斜沒有一個統一的處理方式,要看具體問題。一般常見的方式可以將key加一個隨機擾動量,使得量大的這個key均勻分到不同的reduce中去處理。再起一輪mapreduce處理這次的結果,將key的擾動量去掉,去統計結果。因為第一步reduce處理將key對應的結果大大減少了(題主這個case每個reduce一個key只輸出一條記錄),所以到第二輪mapreduce這個key對應的資料就很少了。 另外,如果一個map輸出的相同的key記錄很多,可以加combiner進行map端的reduce,減少資料量。對於題主的這個case的資料傾斜應該也是有效的,前提是你這個量很大的key在所有的map中也相對均勻的。不然也會導致少量map執行特別久。
是的,相同的key是會發到同一個reduce處理。如果相同的key對應的value量級太大確實會導致這個reduce很慢。如果其他的reduce要處理的資料相對較少,就會出現資料傾斜。 資料傾斜一般是指某一個partitioner的處理的資料量遠大於其他的partitioner,這個在分散式系統中很常見。一般有兩種原因:(1)partition演算法不夠隨機,這種情況比較少見,換相對隨機的演算法就可以。(2)某個key對應的資料非常多,而這個key對應的資料又必須傳送到同一個partitioner進行處理。 對於第二種資料傾斜沒有一個統一的處理方式,要看具體問題。一般常見的方式可以將key加一個隨機擾動量,使得量大的這個key均勻分到不同的reduce中去處理。再起一輪mapreduce處理這次的結果,將key的擾動量去掉,去統計結果。因為第一步reduce處理將key對應的結果大大減少了(題主這個case每個reduce一個key只輸出一條記錄),所以到第二輪mapreduce這個key對應的資料就很少了。 另外,如果一個map輸出的相同的key記錄很多,可以加combiner進行map端的reduce,減少資料量。對於題主的這個case的資料傾斜應該也是有效的,前提是你這個量很大的key在所有的map中也相對均勻的。不然也會導致少量map執行特別久。