r-xx',尽管我没有提到任何reducer类?

ltskdhd1  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(232)

我使用的是Hadoop2.6.0的apache发行版。我知道每个Map器的Map器输出文件的命名格式为“part-m-xx”,每个还原器的还原器输出文件的命名格式为“part-r-xx”。我正在试验一个简单的最高温度用例,我还没有在我的工作配置中设置任何减速器类。在这种情况下,输出文件不是应该命名为“part-m-xx”吗?请在下面找到我的主要课程:

public class MaxTemperature{

    public static void main(String[] args) throws Exception
    {
        Configuration conf = new Configuration();
        Job job = new Job(conf, "Max Temperture");
        job.setJarByClass(MaxTemperature.class);
        int noOfInputPaths = args.length-1;
        for (int i=0; i<noOfInputPaths; i++){
            System.out.println("Adding Input path: "+args[i]);
            FileInputFormat.addInputPath(job, new Path(args[i]));
        }
        System.out.println("Output path: "+args[args.length - 1]);
        FileOutputFormat.setOutputPath(job, new Path(args[args.length - 1]));

        job.setMapperClass(MaxTemperatureMapper.class);
        //job.setReducerClass(MaxTemperatureReducer.class);
        //job.setNumReduceTasks(3);

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

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

        System.exit(job.waitForCompletion(true)? 0 : 1);
    }
}
6ioyuze2

6ioyuze21#

如果mapreduce程序员没有使用job.setreducerclass设置reducer类,那么 IdentityReducer.class 用作默认值。如果您只想对输入进行排序。例如,可以使用identity reducer来实现令人尴尬的并行算法,在这种算法中,您只需要使用Map器来执行并行任务,但您希望对输出键值对进行排序。输出为r-xx部分。
如果你设置

job.setNumReduceTasks(0);

在这种情况下,不会运行减速机,程序的输出将命名为part-m-xx。输出将不排序。

kmynzznz

kmynzznz2#

使用默认的hadoop outputformat,它将初始化并创建名为(part-r-xx)的文件,与您在output folder下看到的相同。
现在,创建的文件为空是因为您没有在reducer部分中写入(context.write(…))。但这并不能阻止在初始化过程中创建它们。
要停止这种情况,您需要定义输出格式来表示您不需要任何输出。请参阅下文。

myJob.setOutputFormat(NullOutputFormat.class);

设置了上述属性后,这将确保您的零件文件永远不会初始化。
注意:您可以使用lazyoutputformat,这将确保只有在有一些数据时才创建输出文件,并且不会初始化空文件。见下文。

LazyOutputFormat.setOutputFormatClass(myJob, TextOutputFormat.class);

希望这有帮助。

相关问题