2013-06-25 107 views
2

減速器在我的MapReduce程序的數量,我必須使用一個Partitionner:Hadoop和Eclipse中

public class TweetPartitionner extends HashPartitioner<Text, IntWritable>{ 

    public int getPartition(Text a_key, IntWritable a_value, int a_nbPartitions) { 
     if(a_key.toString().startsWith("#")) 
      return 0; 
     else 
      return 1; 
    } 

} 

而且我已經設置的減少任務數量:job.setNumReduceTasks(2);

但我得到以下錯誤:java.io.IOException: Illegal partition for #rescinfo (1)

參數a_nbPartitions返回1

我讀過在另一篇文章: Hadoop: Number of reducer is not equal to what I have set in program

在Eclipse中運行它似乎使用本地工作亞軍。它只有 支持0或1個減速器。如果您嘗試將其設置爲使用多個 減速器,它將忽略它並只是使用一個。

我開發了一個安裝在Cygwin上的Hadoop 0.20.2,我當然使用Eclipse。我能怎麼做 ?

回答

4

實際上,您並不需要專用的Hadoop羣集。只是你必須告訴Eclipse你打算在僞分佈式集羣上運行這個工作,而不是在本地運行。要做到這一點,你需要在代碼中添加這些行:

Configuration conf = new Configuration(); 
conf.set("fs.default.name", "hdfs://localhost:9000"); 
conf.set("mapred.job.tracker", "localhost:9001"); 

而在這之後通過設置減速機的數量爲2:

job.setNumReduceTasks(2); 

是的,你必須非常確定自己分區邏輯。您可以訪問此page,其中顯示瞭如何編寫自定義分區程序。

HTH

+0

完美的,它工作得很好!感謝您的鏈接至極是非常精確的,樂於助人! – Apaachee

1

在你有一個專門的hadoop集羣來運行你的工作之前,沒有辦法在本地模式下有超過1個reducer。您可以將Eclipse配置爲將作業提交到hadoop羣集,然後將您的配置考慮在內。

在每種情況下,編寫自己的分區程序時應始終使用return Math.min(i, a_nbPartitions-1)

+0

好,感謝這個答案:( – Apaachee