我正在运行一个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