Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Hadoop java api在Mapreduce作业完成后调用自定义方法?_Java_Hadoop_Mapreduce - Fatal编程技术网

如何使用Hadoop java api在Mapreduce作业完成后调用自定义方法?

如何使用Hadoop java api在Mapreduce作业完成后调用自定义方法?,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我正在尝试运行一个mapreduce程序,只是为了更好地理解WordCount。一切都很顺利,就像你想象的那样。我想在MapReduce程序完成后调用一个函数,在该函数中,我想将reduce步骤中生成的所有零件文件合并为一个包含所有零件文件内容的文本文件。我看到了相关的问题,人们建议使用FileUtil.copyMerge函数。我的问题是如何进行函数调用,以便在整个mapreduce过程之后执行它 public class mapreducetask { private void files

我正在尝试运行一个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进程完成后如何调用函数。

在调用
jb.waitForCompletion(true)
之前,您正在调用位置1中的代码。您需要在之后调用它(显然不需要调用
System.exit()
)。因此:


在调用
jb.waitForCompletion(true)
之前,您正在调用位置1中的代码。您需要在之后调用它(显然不需要调用
System.exit()
)。因此:


酷。这只适用于文件。你能告诉我是否有更好的方法来达到同样的目的吗?还是这样好,酷。这只适用于文件。你能告诉我是否有更好的方法来达到同样的目的吗?或者这样可以吗。
jb.waitForCompletion(true);
//Run your code