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



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

- r - 00000部分

- r - 00001部分

为什么会这样?

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

My Driver类:

<>之前公共类DriverDate扩展配置实现工具{@Overridepublic int run(String[] args)抛出异常{如果(arg游戏。长度!= 2){system . out。printf("Usage: AvgWordLength inputDir outputDirn");system . exit (1);}Job Job = new Job(getConf());的工作。setJobName("工作转换日期");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。setputpaths (job, new Path(args[0]));FileOutputFormat。setOutputPath(job, new Path(args[1]));job.waitForCompletion(真正的);返回0;}public static void main(String[] args)抛出异常{Configuration conf = new Configuration();ToolRunner.run(conf,new DriverDate(), args);}}

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

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

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

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

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

集群中节点的数量是无关的

好了,我找到答案了。

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

为了解决这个问题,有两个选择,通过java显式地将reducer的数量设置为1:

job.setNumReduceTasks (1);

,或者在Cloudera Manager

的Yarn Configuration中更改默认reducer的值。

相关内容

  • 没有找到相关文章

最新更新