回覆列表
-
1 # 使用者3442827646229
-
2 # maimi32709
hm已是一個HashMap的引用.如果你知道當前的這個key,可以透過hm.get(key)方法來獲得value.獲得key的方法hm.keySet();因為你不知道key是哪個其實該方法就是獲得一個key的集合.具體可以結合以下例子看看,裡面有個迭代器用於遍歷的.Sets=hm.keySet();//透過keySet方法可獲得所有key的集合,放在一個容器Set裡面.Iteratorit=s.iterator();//獲得一個迭代器引用it,透過s.iterator方法好比使“指標”指向//set裡面的第一個元素的位置while(it.hasNext())//set裡面如果有下一個{Integerkey=it.next();//返回當前set中的這個元素(因為set中都是放的key,“指標”指向下一個System.out.println(hm.get(key));//利用hm.get(key)方法獲得該key對應的value}
是的,相同的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執行特別久。