#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. Прохладный. Это работает только с файлом. Можете ли вы сказать мне, существует ли лучший способ добиться того же? Или это нормально.