Как вызвать пользовательский метод после завершения задания Mapreduce с использованием Hadoop java api?

#java #hadoop #mapreduce

#java #hadoop #mapreduce

Вопрос:

Я пытаюсь запустить программу mapreduce, просто WordCount для лучшего понимания. Все работает довольно хорошо, как и предполагалось. Я хочу вызвать функцию после завершения программы MapReduce, и в этой функции я хочу объединить все файлы деталей, созданные на шаге сокращения, в один текстовый файл, содержащий содержимое всех файлов деталей. Я видел связанную проблему, и люди предложили использовать функцию 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.

Ответ №1:

Перед вызовом вы вызываете код в местоположении 1 jb.waitForCompletion(true) . Вам нужно вызвать его после (и, очевидно, не вызывать System.exit() ). Так:

 jb.waitForCompletion(true);
//Run your code
  

Комментарии:

1. Прохладный. Это работает только с файлом. Можете ли вы сказать мне, существует ли лучший способ добиться того же? Или это нормально.