2012-05-25 33 views
0

的最佳數目我有一個流的map-reduce任務。我有30個插槽供處理。最初我得到一個包含60條記錄的單個輸入文件(字段是製表符分隔的),每個記錄的第一個字段是一個數字,對於第一個記錄號(第一個字段)是1,對於第二個記錄號(第一個字段)是2等等。我想從這些記錄中爲下一步處理創建30個文件,每個包含2個記錄(均勻分佈)。的hadoop streaming越來越插槽

對於這個工作我指定的減速器數量的Hadoop作業作爲30.我預計,第一場將被用作鍵,我將獲得30輸出文件每個包含2個記錄。

我得到30個的輸出文件,但不是所有的相同數量的記錄。有些文件甚至是空的(零大小)。任何想法

+1

你必須寫自己的分區中,hashpartitioner不保證完美分配所有任務。 –

回答

0

Hadoop的默認suffle並結合Map任務輸出爲減速input.So地圖輸出設置具有相同的鍵值 做一些這方面的減速可能沒有輸入集映射到相同reducer.so,所以說部分-00005文件的大小爲0 KB。

0

什麼是你的輸出密鑰類型?如果您使用的是文字,而不是IntWritable(我假設你必須爲你使用流媒體),則減少數的計算基於字節表示鍵值的UTF-8「串」的哈希值。你可以寫一個簡單的單元測試的行動不遵守此:

public class TextHashTest { 
    @Test 
    public void testHash() { 
     int partitions = 30; 
     for (int x = 0; x < 100; x++) { 
      int hash = new Text(String.valueOf(x)).hashCode(); 
      int part = hash % partitions; 
      System.err.printf("%d = %d => %d\n", x, hash, part);    
     } 
    } 
} 

我不會糊輸出,但100個值,分箱0-7從來沒有收到任何價值。

所以像托馬斯Jungblut在他的評論中說,你需要編寫自定義分區到文本值重新轉換成一個整數值,然後分區的總數模這個數字 - 但是這可能仍然不給你「甚至」分佈,如果值本身是不是在1 - 順序(你說他們是如此的你應該確定)

public class IntTextPartitioner implements Partitioner<Text, Text> { 
    public void configure(JobConf job) {} 

    public int getPartition(Text key, Text value, int numPartitions) { 
     return Integer.valueOf(key.toString()) % numPartitions; 
    }    
}