我正在尝试运行mapreduce程序,为了更好地理解,仅使用WordCount。一切都像预期的那样运转良好。我想在MapReduce程序完成后调用一个函数,在该函数中,我希望将reduce步骤中生成的所有部分文件合并为一个包含所有部分文件内容的文本文件。我已经看到相关问题,有人建议使用 FileUtil.copyMerge 函数。我的问题是如何进行函数调用,以便在整个mapreduce过程之后执行该函数。
public class mapreducetask {
private void filesmerger(){
// I want to merge partfiles here in the function(maybe using FileUtils.copyMerge)
}
public static void main(String [] args) throws Exception{
Configuration cnf = new Configuration();
cnf.set("mapreduce.output.textoutputformat.seperator",":");
Integer numberOfReducers = 3;
Job jb = new Job(cnf,"mapreducejob");
jb.setJarByClass(mapreducetask.class);
jb.setMapperClass(mapper.class);
jb.setNumReduceTasks(numberOfReducers);
jb.setReducerClass(reducer.class);
jb.setOutputKeyClass(Text.class);
jb.setOutputValueClass(IntWritable.class);
jb.setInputFormatClass(customfileinputformat.class);
Path input = new Path("Input");
Path output = new Path ("Output");
FileInputFormat.addInputPath(jb, input);
FileOutputFormat.setOutputPath(jb, output);
// Should I call my merger function here. Location 1
System.exit(jb.waitForCompletion(true)?0:1);
}
}
当我从位置1拨打电话时(请参见代码),它似乎甚至在我不需要的mapreduce程序之前就已执行。完成Mapreduce流程后如何调用函数。
答案 0 :(得分:0)
在调用jb.waitForCompletion(true)
之前,您要在位置1中调用代码。您需要在之后调用它(显然不调用System.exit()
)。所以:
jb.waitForCompletion(true);
//Run your code