Мне нужно написать программу сокращения карт, которая вызывает два редуктора подряд. ie, выход первого редуктора будет входом для второго редуктора. Как мне этого добиться?
То, что я нашел до сих пор, говорит о том, что мне нужно будет настроить два задания по уменьшению карты в моем коде драйвера (код ниже). Это выглядит расточительно по двум причинам -
- Мне действительно не нужен мапер на второй работе
- , если две работы выглядят как перебор.
Есть ли лучший способ добиться этого?
Кроме того, вопрос о следующем подходе: выходные данные Job1 будут иметь несколько файлов в каталоге OUTPUT_PATH. Этот каталог передается как вход Job2, это нормально? Разве это не должен быть файл? Будет ли Job2 обрабатывать все файлы в данном каталоге?
Configuration conf = getConf();
FileSystem fs = FileSystem.get(conf);
Job job = new Job(conf, "Job1");
job.setJarByClass(ChainJobs.class);
job.setMapperClass(MyMapper1.class);
job.setReducerClass(MyReducer1.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
TextInputFormat.addInputPath(job, new Path(args[0]));
TextOutputFormat.setOutputPath(job, new Path(OUTPUT_PATH));
job.waitForCompletion(true); /*this goes to next command after this job is completed. your second job is dependent on your first job.*/
/*
* Job 2
*/
Configuration conf2 = getConf();
Job job2 = new Job(conf2, "Job 2");
job2.setJarByClass(ChainJobs.class);
job2.setMapperClass(MyMapper2.class);
job2.setReducerClass(MyReducer2.class);
job2.setOutputKeyClass(Text.class);
job2.setOutputValueClass(Text.class);
job2.setInputFormatClass(TextInputFormat.class);
job2.setOutputFormatClass(TextOutputFormat.class);
TextInputFormat.addInputPath(job2, new Path(OUTPUT_PATH));
TextOutputFormat.setOutputPath(job2, new Path(args[1]));
return job2.waitForCompletion(true) ? 0 : 1;