2013-12-19 58 views
1

我有一個場景,我不確定減少處理器位置的位置。Hadoop減速器:如何確保減速器均勻地運行在多個節點上

ⅰ)我有一個輸入的文本文件,它具有整數的1000的以平衡取值範圍爲1和4

ⅱ)讓我們假設有一個4節點集羣12個槽的每個節點之間其中4個被分配爲減速器 - 給我們總共16個減少插槽

三)我已經設置在駕駛員減速的數量:

jobConf.setNumReduceTasks(4); 

III)和最後給我一個分區方法是

public class MyPartitioner extends Partitioner<Text,Text>{ 
    @Override 
    public int getPartition(Text key, Text value, int numPartitions) { 
    return Integer.parseInt(key.toString()); 
    }  
} 

1) i。 如何強制它在每個節點上使用1個縮減器(使其他3個本地縮減器處於空閒狀態)而不是在每個節點上運行多個縮減器來處理縮減IE如何確保不在一個節點上使用4個插槽節點並且在節點上有12個空閒空閒。

ii。 Hadoop MR管理資源說:「節點X是最空閒的,我會在那裏產生一個reducer ...」

2)如果你有一個關鍵歪斜,但打算分組,那麼你能產生該密鑰的多個reducer,例如,將一個隨機整數添加到值爲「4」的種子值,並使用分區器在reducer 4,5,6和7中添加3個額外的reducer以處理值「4」?

jobConf.setNumReduceTasks(7); 

public class MyPartitioner2 extends Partitioner<Text,Text>{ 
    @Override 
    public int getPartition(Text key, Text value, int numPartitions) { 
     int p = Integer.parseInt(key.toString()); 
     if (p == 4){return p + (new Random()).nextInt(4);}//extra 3 partitions... 
     return p; 
    } 
} 

但願歪斜的工作?

回答

1

這不是你可以控制的東西 - 地圖和減速器任務分配給節點由JobTracker處理。

有O'Reilly的回答,詳細任務分配的細節在一個良好的金額細節:

http://answers.oreilly.com/topic/459-anatomy-of-a-mapreduce-job-run-with-hadoop/

默認行爲是分配每個作業調度器的更新迭代這樣一個任務您通常不應該看到同一個節點滿足的所有減少任務 - 但是如果您的羣集忙於其他任務並且只有一個節點具有可用的縮減程序插槽,那麼您的所有減少任務都可能分配給該節點。

至於處理偏差,這將緩解可能發送到單個節點的單個已知高容量密鑰的所有數據(同樣不能保證這一點),但是您仍然會遇到問題需要將這個歪斜鍵的三個減速器輸出組合成最終答案。

+0

很好的參考 - 我錯過了這些聲明的含義,最初由於突出了這一點。我假設這是可以減少密鑰對的簡單減少 – rupert160

+0

是 - 身份映射器沒有自定義分區器和您當前使用的同一個reducer –