Как вызвать пользовательский метод после завершения работы Mapreduce, используя Hadoop Java API? - PullRequest
1 голос
/ 15 апреля 2019

Я пытаюсь запустить программу 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 Ответ

0 голосов
/ 15 апреля 2019

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

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