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

Hadoop 将reducers设置为默认值,但最后我有两个文件,hadoop,mapreduce,Hadoop,Mapreduce,我正在运行一个map reduce作业,其中还原数设置为默认值(一个还原数)。理论上,每个减速机的输出必须是一个文件,但当我运行作业时,我有两个文件 r-00000部分 及 第r-00001部分 为什么会这样 我的群集中只有一个节点 我的驾驶课: public class DriverDate extends Configured implements Tool { @Override public int run(String[] args) throws Exception

我正在运行一个map reduce作业,其中还原数设置为默认值(一个还原数)。理论上,每个减速机的输出必须是一个文件,但当我运行作业时,我有两个文件

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); } } 公共类DriverDate扩展配置的实现工具{ @凌驾 公共int运行(字符串[]args)引发异常{ 如果(参数长度!=2){ System.out.printf(“用法:AvgWordLength inputDir outputDir\n”); 系统退出(-1); } Job Job=新作业(getConf()); job.setJobName(“作业转换日期”); job.setJarByClass(DriverDate.class); job.setMapperClass(MapDate.class); job.setReduceClass(ReduceDate.class); job.setMapOutputKeyClass(Text.class); 作业.setMapOutputValueClass(NullWritable.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(NullWritable.class); setInputPaths(作业,新路径(args[0]); setOutputPath(作业,新路径(args[1]); job.waitForCompletion(true); 返回0; } 公共静态void main(字符串[]args)引发异常{ Configuration conf=新配置(); run(conf,newdriverdate(),args); } }
这段代码应该生成一个输出文件,这是正确的,因为reduce任务的默认数量是1,每个reducer生成一个输出文件

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

  • 确保运行了正确的jar,并确保在生成jar时更新了正确的jar。确保将正确的jar从生成它的计算机复制到(单节点)集群的主机。例如,在你的指示中,你说
    用法:AvgWordLength inputDir outputDir
    , 但是这个罐子的名字不太可能是AvgWordLength

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

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


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

好的,我找到了答案

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

为了解决这个问题,有两个选项,通过java将简化程序的数量显式设置为1,使用:

作业。setNumReduceTasks(1)


,或者在Cloudera Manager中更改纱线配置的默认减速机的值

可以发布您的主方法(或驱动程序类)以及运行程序所执行的命令吗?没有其他额外的配置,我确信我运行的jar是正确的。然后,我没有答案。。。就等别人吧。。对不起,祝你好运!地图(中间数据)后的数据大小是多少?。如果您手动将reduce设置为1,您是否在reduce阶段重试过。?Abdulrahman,我找到了答案,您是对的,将reducer的数量设置为一个显式是解决问题的一种方法