2017-08-03 21 views
2

在爲MapReduce作業編寫代碼時,如果我們手動設置縮減器的數量,則發送到某個縮減器的數據可能很大。在這種情況下,Reducer任務是否可以同時在多個節點上運行?也許通過將List<Value>中的數據除以對應的密鑰,然後在內部進行合併?reducer可以動態地使用多個節點嗎?

如果reducer不能自動縮放它要使用的節點數量,那麼我們如何處理可能存在對應於鍵的值的不均勻分佈的情況? default hadoop MapReduce partitioner分區的基礎上散列的值,並沒有考慮到List<Value>對應的密鑰的大小。

回答

2

不,縮減器不會自動縮放。如果它的工作量太大,就會崩潰。

您可以做的最好的方法是編寫您自己的定製分區程序,以便在減速器之間平均分配工作負載。這樣做並不總是很容易,因爲您可能需要對數據進行抽樣或估計,或者甚至需要額外的計數工作,並且編寫滿足問題需求的體面負載平衡算法。

你想要什麼,可能不是基於每個鍵的值的大小來分配負載,而是基於減速器將執行的計算(這兩個並不總是相同)。

+0

好的,但有兩件事。 1.是否可以定義分配給reducer的節點資源的百分比? 2.如果我們必須在某種情況下手動設置減速器的數量,那麼可以採取什麼措施來減輕某些減速器負擔過重的問題? –

+1

@DhruvMullick恐怕我沒有答案1.關於2.如果你不想採樣,你可以手動設置一個自定義的分區器,將你期望的最重的負載分配給一個reducer他們自己的(即,沒有其他鍵應該去同一個reducer)。例如,在WordCount中,將從最常見的字母(例如字母'')開始的所有單詞隨機地發送給它們自己的所有單詞和所有其他單詞。 – vefthym

相關問題