我使用的是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);
}
}
2条答案
按热度按时间6ioyuze21#
如果mapreduce程序员没有使用job.setreducerclass设置reducer类,那么
IdentityReducer.class
用作默认值。如果您只想对输入进行排序。例如,可以使用identity reducer来实现令人尴尬的并行算法,在这种算法中,您只需要使用Map器来执行并行任务,但您希望对输出键值对进行排序。输出为r-xx部分。如果你设置
在这种情况下,不会运行减速机,程序的输出将命名为part-m-xx。输出将不排序。
kmynzznz2#
使用默认的hadoop outputformat,它将初始化并创建名为(part-r-xx)的文件,与您在output folder下看到的相同。
现在,创建的文件为空是因为您没有在reducer部分中写入(context.write(…))。但这并不能阻止在初始化过程中创建它们。
要停止这种情况,您需要定义输出格式来表示您不需要任何输出。请参阅下文。
设置了上述属性后,这将确保您的零件文件永远不会初始化。
注意:您可以使用lazyoutputformat,这将确保只有在有一些数据时才创建输出文件,并且不会初始化空文件。见下文。
希望这有帮助。