2017-02-04 4 views
3

Я пытаюсь реализовать MapReduce программу, чтобы сделать wordcounts из 2 файлов, а затем сравнивая количество слов из этих файлов, чтобы увидеть, что наиболее часто встречающиеся слова ...MapReduce вопросы

я заметил, что после выполнения WordCount для файла 1, результаты, которые попадают в каталог «/ data/output1 /», внутри находятся 3 файла. - «_SUCCESS» - «_logs» - «part-r-00000» «part-r-00000» - это файл, содержащий результаты из файла word1 wordcount. Как заставить мою программу читать этот конкретный файл, если имя файла генерируется в реальном времени, не зная заранее имя файла?

Кроме того, для пар (ключ, значение) я добавил идентификатор к «значению», чтобы иметь возможность идентифицировать, какой файл и считать, что принадлежит этому слову.

public void map(Text key, Text value, Context context) throws IOException, InterruptedException { 
      Text newValue = new Text(); 
      newValue.set(value.toString() + "_f2"); 
      context.write(key, newValue); 
} 

на более позднем этапе, как мне «удалить» идентификатор, чтобы я мог просто получить «значение»?

ответ

1

Если вы хотите выполнить подсчет слов из двух разных файлов, вы можете использовать множественный входной класс, с помощью которого вы можете одновременно применять программу уменьшения карты для обоих файлов. См. Эту ссылку для примера того, как ее реализовать. http://www.hadooptpoint.com/hadoop-multiple-input-files-example-in-mapreduce/ здесь вы определите отдельный картограф для каждого входного файла, таким образом, вы можете добавить другой идентификатор в файл карты, а затем, когда выход будет отправлен на редуктор, он может определить, из какого файла карты, который вводит поступает и может соответствующим образом обрабатывать его. И вы можете удалить идентификатор таким же образом, как вы добавляете их, например, если вы добавите префикс @ в mapper 1 output key и # в keyper 2 output key, тогда в редукторе вы можете определить, из какого ввода карты идет с использованием этого префикса, а затем вы можете просто удалить этот префикс в редукторе.

Помимо этого, ваш другой запрос, связанный с чтением файла, просто имеет имя выходного файла aways, если вы используете hasoop1.x, тогда результат будет сохранен в имени файла как часть 00000 и далее и с результатом hadoop 2.x будет храниться в имени файла part-r-00000, если есть другой вывод, который должен быть записан в том же пути вывода, что и он будет сохранен в part-r-00001 и далее. Другие два файла, которые сгенерированы, не имеют никакого значения для разработчиков, они больше действуют как полдела для самого хаопа

Надеюсь, что это поможет вам решить. Прокомментируйте, если ответ не ясен.

3

Просто укажите следующее задание MR на/data/output1 /. Он будет считывать все три файла в качестве входных данных, но _SUCCESS и _logs являются пустыми, поэтому они не будут влиять на вашу программу. Они просто написаны так, что вы можете сказать, что запись задания MR в каталог завершена успешно.