2

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

在 Eclipse 中运行它似乎使用本地作业运行器。它只支持 0 或 1 个减速器。如果您尝试将其设置为使用多个减速器,它会忽略它并只使用一个。

我在 Cygwin 上安装的 Hadoop 0.20.2 上进行开发,当然我使用 Eclipse。我能怎么做 ?

4

2 回答 2

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);

是的,您必须非常确定您的分区器逻辑。您可以访问此页面,该页面显示如何编写自定义分区程序。

高温高压

于 2013-06-25T18:56:20.470 回答
1

在你有一个专门的 hadoop 集群来运行你的工作之前,没有办法在本地模式下拥有超过 1 个 reducer。您可以配置 Eclipse 以将您的作业提交到 hadoop 集群,然后您的配置将被考虑在内。

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

于 2013-06-25T14:00:39.087 回答