Hadoop和Eclipse中的减速器数量



在我的mapReduce程序中,我必须使用Partitionner:

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:减速器的数量不等于我在程序中设置的数量

在eclipse中运行它似乎使用了本地作业运行程序。它只是支持0或1个减速器。如果您尝试将其设置为使用多个reducer,它会忽略它,无论如何都只使用一个。

我在Cygwin上安装的Hadoop0.20.2上进行开发,当然我使用Eclipse。我该怎么办?

实际上不需要专门的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);

是的,你必须非常确信你的党派逻辑。您可以访问此页面,其中显示如何编写自定义分区器。

HTH

除非有一个专用的hadoop集群来运行作业,否则在本地模式下不可能有超过1个reducer。不过,您可以将Eclipse配置为将作业提交到hadoop集群,然后将考虑您的配置。

在任何情况下,在编写自己的partitioner时都应该始终使用return Math.min(i, a_nbPartitions-1)

相关内容

  • 没有找到相关文章

最新更新