将reducer设置为默认值,但最后我有两个文件

时间:2015-07-20 09:55:26

标签: hadoop mapreduce

我正在运行一个map reduce工作,并将reducers数设置为默认值(一个reducer)。从理论上讲,每个reducer的输出必须是一个文件,但是当我运行我的工作时,我有两个文件

部分-R-00000

部分-R-00001

为什么会这样?

我的群集中只有一个节点。

我的驱动程序类:

public class DriverDate extends Configured implements Tool {

    @Override
    public int run(String[] args) throws Exception {
        if (args.length != 2) {
            System.out.printf("Usage: AvgWordLength inputDir outputDir\n");
            System.exit(-1);
        }
            Job job = new Job(getConf());
            job.setJobName("Job transformacio dates");

            job.setJarByClass(DriverDate.class);
            job.setMapperClass(MapDate.class);
            job.setReducerClass(ReduceDate.class);

            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(NullWritable.class);

            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(NullWritable.class);


            FileInputFormat.setInputPaths(job, new Path(args[0]));


            FileOutputFormat.setOutputPath(job, new Path(args[1]));

            job.waitForCompletion(true);

        return 0;
    }

    public static void main(String[] args) throws Exception{
        Configuration conf = new Configuration();
        ToolRunner.run(conf,new DriverDate(), args);
    }

}

2 个答案:

答案 0 :(得分:1)

你是对的,这段代码应该生成一个输出文件,因为默认的reduce任务数是1,每个reducer生成一个输出文件。

然而,可能出错的事情包括(但不限于):

  • 确保运行正确的jar并确保在生成时更新正确的jar。确保将正确的jar从生成它的计算机复制到(单节点)群集的主服务器。例如,在您的说明中,您说 Usage: AvgWordLength inputDir outputDir, 但这个罐子的名字不大可能是AvgWordLength ......

  • 确保您没有从命令行指定不同数量的reducer(例如,使用-D属性)。

除此之外,我找不到任何其他可能的原因......

群集中的节点数量无关紧要。

答案 1 :(得分:0)

好的,我找到了答案。

在cloudera Manager中,Yarn(MR2)中的配置选项具有每个作业的reducers任务的默认值,在一个节点集群中设置为2,因此默认缩减器的数量为2。

为了解决这个问题,有两个选项,通过java将exportion的数量设置为1:

job.setNumReduceTasks(1);

,或在Cloudera Manager中更改纱线配置中的默认缩减器的值