为什么我的输出文件名为 'part-r-xxxxx',即使我没有提到任何减速器 class?

Why are my output files named 'part-r-xxxxx', even though I have not mentioned any reducer class?

我正在使用 Hadoop 2.6.0 的 Apache 发行版。我知道映射器的输出文件以每个映射器的格式 'part-m-xxxxx' 命名,而缩减器的输出文件以每个缩减器的 'part-r-xxxxx' 格式命名。我正在试验一个简单的 Max-Temperature 用例,并且我没有在我的作业配置中设置任何减速器 class。既然如此,输出文件不应该命名为'part-m-xxxxx'吗?请在下面找到我的主要 class:

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);
    }
}

正在使用默认的 Hadoop 输出格式,它将初始化并创建名为 (part-r-xxxxx) 的文件,与您在输出文件夹下看到的相同。

现在,创建的文件是空的,因为您没有在 reducer 部分写入(context.write(...))。但这并不能阻止它们在初始化期间被创建文件。

要停止这种情况,您需要定义输出格式以说明您不需要任何输出。参考下文。

myJob.setOutputFormat(NullOutputFormat.class);

以上 属性 设置后,这应该确保您的零件文件永远不会被初始化。

注意:您可以使用 LazyOutputFormat,这将确保您的输出文件仅在有一些数据时才创建,并且不会初始化空文件。见下文。

LazyOutputFormat.setOutputFormatClass(myJob, TextOutputFormat.class);

希望对您有所帮助。

如果 MapReduce 程序员未使用 job.setReducerClass 设置 Reducer Class,则 IdentityReducer.class 将用作默认值。 如果您只想对输入进行排序。例如,身份缩减器可用于实现令人尴尬的并行算法,您只需使用映射器来执行并行任务,但您希望对输出键值对进行排序。输出将是 part-r-xxxxx.

如果你设置

job.setNumReduceTasks(0);

在这种情况下,没有减速器 运行 并且程序的输出将命名为 part-m-xxxxx。输出将不会排序。