2013-04-09 59 views
2

假設我們有3個mapper(m1,m2和m3)和2個reducers(r1和r2)。地圖輸出分區的大小?

每個減速器從由每個映射器生成的文件獲取其輸入的分區。

從作業歷史中,我可以提取每個減少任務的總輸入量, 但我想知道每個映射器對這個減速器輸入量的貢獻量嗎?

例如,減速器R1將收到INPUT_r1如:

INPUT_r1 =(分區從M1取出)+(分區從平方米取出)+(分區從立方米取出)

我想從mappers知道這些分區的大小?

回答

0

幾件事情需要以找到映射器分區的大小要考慮的。

首先,我們應該認識到,在Hadoop中,partitioners執行合之前,因此,如果你在你的邏輯有一個組合,你將需要考慮它...如果它影響你試圖找到的大小。這是相關的,如果你發現大小的另一種方式比我建議在這裏。

其次,默認分區HashPartitioner分配大致相同的數字鍵的每個減速機。所使用的方法是:

public int getPartition(K2 key, V2 value, int numReduceTasks) { 

    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; 
} 

注意,分割器只考慮了鍵,並忽略其可以向傳播給減速器數據的不均勻分佈的值。

我會怎麼做才能找到大小,在HashPartitioner或自定義分區程序附近設置一個計數器,並計算每個鍵值對的大小。然後爲每個分區器輸出這個值。您可能需要跟蹤每個分區發送數據的位置,因爲分區器本身不知道他們將數據發送給誰。

很多這個問題的研究參考從MapReduce Book