我正在运行一个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); } }
答案 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中更改纱线配置中的默认缩减器的值