Подтвердить что ты не робот

Карта Hadoop и несколько сокращений

У нас есть большой набор данных для анализа с помощью нескольких сокращений.

Все алгоритмы сокращают работают на одном наборе данных, сгенерированном той же самой функцией map. Чтение большого набора данных стоит слишком много, чтобы делать это каждый раз, было бы лучше читать только один раз и передавать отображаемые данные в несколько сокращать.

Могу ли я сделать это с помощью Hadoop? Я искал примеры и intarweb, но я не мог найти никаких решений.

4b9b3361

Ответ 1

Ожидаете ли вы, что каждый редуктор будет работать с точно такими же отображаемыми данными? Но, по крайней мере, "ключ" должен отличаться, поскольку он решает, какой редуктор должен идти.

Вы можете написать вывод несколько раз в mapper и вывести его как ключ (где $i для i-го редуктора, а ключ $- ваш исходный ключ). И вам нужно добавить "Partitioner", чтобы убедиться, что эти n записей распределены в редукторах на основе $i. Затем используйте "GroupingComparator" для группировки записей с помощью исходного ключа $.

Это можно сделать, но не тривиально в одном MR.

Ответ 2

Возможно, простым решением было бы написать задание, которое не имеет функции сокращения. Таким образом, вы передадите все сопоставленные данные непосредственно на выход задания. Вы просто установили число редукторов на ноль для задания.

Затем вы должны написать задание для каждой функции сокращения, которая работает с этими данными. Это будет означать сохранение всех отображенных данных на HDFS.

Другой альтернативой может быть объединение всех ваших функций сокращения в один редуктор, который выводит на несколько файлов, используя другой вывод для каждой другой функции. Несколько выходов упоминаются в этой статье для hadoop 0.19. Я уверен, что эта функция нарушена в новом API-интерфейсе mapreduce, выпущенном с 0.20.1, но вы все равно можете использовать его в более раннем API-интерфейсе.

Ответ 3

Вы можете использовать составные клавиши. Скажем, вам нужны два вида редукторов: "R1" и "R2". Добавьте идентификаторы для них в качестве префикса для ваших ключей o/p в устройстве сопоставления. Таким образом, в картографе ключ "K" теперь становится "R1: K" или "R2: K".

Затем в редукторе передайте значения для реализаций R1 или R2 на основе префикса.

Ответ 4

Я думаю, вы хотите использовать разные редукторы в цепочке. В hadoop "несколько редукторов" означает запуск нескольких экземпляров одного и того же редуктора. Я бы предложил вам запустить один редуктор за раз, предоставляя тривиальную функцию карты для всех из них, кроме первой. Чтобы свести к минимуму время передачи данных, вы можете использовать сжатие.

Ответ 5

Конечно, вы можете определить несколько редукторов. Для задания (Hadoop 0.20) просто добавьте:

job.setNumReduceTasks(<number>);

Но. Ваша инфраструктура должна поддерживать несколько редукторов, что означает, что вы должны

  • доступно более одного процессора.
  • скорректируйте mapred.tasktracker.reduce.tasks.maximum в файле mapred-site.xml.

И, конечно, ваша работа должна соответствовать некоторым спецификациям. Не зная, что именно вы хотите сделать, я могу только дать широкие советы:

  • ключевой map-output должен быть разделяемым на% numreducers ИЛИ вы должны определить свой собственный разделитель: job.setPartitionerClass(...) например, со случайным разделителем...
  • данные должны быть сокращенными в секционированном формате... (нужны ссылки?)

Вы получите несколько выходных файлов, по одному для каждого редуктора. Если вам нужен отсортированный вывод, вам нужно добавить еще одно задание, в котором будут считываться все файлы (на этот раз несколько заданий на карту...) и написать их отсортированы только с одним редуктором...

Посмотрите также на Combiner-Class, который является местным редуктором. Это означает, что вы можете агрегировать (уменьшать) уже в памяти по частичным данным, испускаемым картой. Очень хороший пример - пример WordCount. Карта испускает каждое слово в качестве ключа, а его число равно 1: (слово, 1). Комбинер получает частичные данные с карты, испускает (,) локально. Редуктор делает то же самое, но теперь некоторые (комбинированные) wordcounts уже > 1. Сохраняет полосу пропускания.

Ответ 6

Я все еще не понимаю, что вы можете использовать следующую последовательность:

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

Также ваше использование парадигмы MapReduce для данной проблемы неверно, используя единую функцию карты, а множество "разных" функций сокращения не имеет смысла, это показывает, что вы просто используете карту для передачи данных на разные машины, чтобы делать разные вещи. вы не нуждаетесь в hadoop или какой-либо другой специальной архитектуре для этого.