为什么我的输出文件名为 '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。输出将不会排序。
我正在使用 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。输出将不会排序。