Карта -> Уменьшить -> Уменьшить (два редуктора должны вызываться последовательно) - как настроить программу драйвера - PullRequest
0 голосов
/ 07 марта 2020

Мне нужно написать программу сокращения карт, которая вызывает два редуктора подряд. ie, выход первого редуктора будет входом для второго редуктора. Как мне этого добиться?

То, что я нашел до сих пор, говорит о том, что мне нужно будет настроить два задания по уменьшению карты в моем коде драйвера (код ниже). Это выглядит расточительно по двум причинам -

  1. Мне действительно не нужен мапер на второй работе
  2. , если две работы выглядят как перебор.

Есть ли лучший способ добиться этого?

Кроме того, вопрос о следующем подходе: выходные данные 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;

1 Ответ

1 голос
/ 09 марта 2020

действительно не нужен maper на второй работе

Фреймворк делает, хотя

с двумя заданиями выглядит излишним ... Есть ли лучший способ добиться этого?

Тогда не используйте MapReduce ... Spark, например, скорее всего будет быстрее и будет иметь меньше кода

Будет ли Job2 обрабатывать все файлы в данном каталоге?

Да

...