Настройте объединение сторон карты для нескольких картографов в Hadoop Map / Reduce - PullRequest
4 голосов
/ 12 июня 2011

У меня есть вопрос о настройке внутреннего соединения Map / Side для нескольких картографов в Hadoop. Предположим, у меня есть два очень больших набора данных A и B, я использую один и тот же алгоритм разделения и сортировки, чтобы разбить их на более мелкие части. Для A предположим, что у меня есть от (1) до (10), а для B у меня есть от b (1) до (10). Гарантируется, что a (1) и b (1) содержат одинаковые ключи, a (2) и b (2) имеют одинаковые ключи и т. Д. Я хотел бы настроить 10 картографов, в частности, mapper (1) к mapper (10). Насколько я понимаю, соединение Map / Side является задачей предварительной обработки до отображения, поэтому я хотел бы объединить a (1) и b (1) для mapper (1), объединить a (2) и b ( 2) для картографа (2) и т. Д.

После прочтения некоторых справочных материалов мне все еще не ясно, как настроить эти десять картографов. Я понимаю, что с помощью CompositeInputFormat я смог бы объединить два файла, но, похоже, настраивал только один маппер и соединял пару файлов 20 за парой (в 10 последовательных задачах). Как настроить все эти десять картографов и объединить десять пар одновременно в подлинном Map / Reduce (10 задач параллельно)? Насколько я понимаю, десяти картографам потребовалось бы десять параметров CompositeInputFormat, потому что все файлы, к которым нужно присоединиться, разные. Я твердо верю, что это практично и выполнимо, но я не мог понять, какие именно команды мне следует использовать.

Любые намеки и предложения приветствуются и приветствуются.

Shi


Большое спасибо за ответы, Дэвид и Томас!

Я ценю ваше внимание к предварительным требованиям для присоединения к карте. Да, я знаю о сортировке, API и т. Д. После прочтения ваших комментариев я думаю, что моя настоящая проблема заключается в том, каково правильное выражение для объединения нескольких разбиений двух файлов в CompositeInputFormat. Например, у меня dataA и dataB отсортированы и уменьшены в 2 файлах соответственно:

/ А / dataA-т-00000

/ А / dataA-т-00001

/ В / dataB-т-00000

/ В / dataB-т-00001

Команда выражения, которую я сейчас использую:

* * Внутренний тысячу двадцать-три (TBL (org.apache.hadoop.mapred.KeyValueTextInputFormat, "/ А / dataA-т-00000"), TBL (org.apache.hadoop.mapred.KeyValueTextInputFormat, "/ В / dataB-т-00000 «))

Это работает, но, как вы упомянули, запускает только два сопоставителя (поскольку внутреннее объединение предотвращает разбиение) и может быть очень неэффективным, если файлы большие. Если я хочу использовать больше картографов (скажем, еще 2 картографа для соединения dataA-r-00001 и dataB-r-00001), как мне построить выражение, это что-то вроде:

String joinexpression = "inner (tbl (org.apache.hadoop.mapred.KeyValueTextInputFormat, '/ A / dataA-r-00000'), tbl (org.apache.hadoop.mapred.KeyValueTextInputFormat, '/ B / dataB -r-00000 '), tbl (org.apache.hadoop.mapred.KeyValueTextInputFormat,' / A / dataA-r-00001 '), tbl (org.apache.hadoop.mapred.KeyValueTextInputFormat,' / B / dataB-r -00001 ')) ";

Но я думаю, что это может быть ошибкой, потому что приведенная выше команда фактически выполняет внутреннее объединение четырех файлов (что в моем случае ничего не даст, потому что у файлов * r-00000 и * r-00001 есть непересекающиеся ключи).

Или я мог бы просто использовать две папки в качестве входных данных, например:

String joinexpression = "inner (tbl (org.apache.hadoop.mapred.KeyValueTextInputFormat, '/ A /'), tbl (org.apache.hadoop.mapred.KeyValueTextInputFormat, '/ B /'))";

Внутреннее объединение будет автоматически сопоставлять пары в соответствии с окончаниями файла, скажем, от «00000» до «00000», от «00001» до «00001»? Я застрял в этой точке, потому что мне нужно создать выражение и передать его

conf.set ("mapred.join.expr", joinexpression);

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

Ответы [ 2 ]

4 голосов
/ 15 июня 2011

Есть карты - и уменьшить боковые соединения.Вы предложили использовать соединение на стороне карты, которое выполняется внутри картографа, а не перед ним.Обе стороны должны иметь одинаковые ключи и типы значений.Таким образом, вы не можете присоединиться к LongWritable и Text, хотя они могут иметь одно и то же значение.

Есть еще несколько моментов, на которые следует обратить внимание:

  • входные файлы имеютдля сортировки, поэтому, скорее всего, это будет выход редуктора
  • Вы можете контролировать количество картографов в вашей фазе соединения-карты, задав число редукторов в задании, которое должно было отсортировать наборы данных

Вся процедура в основном работает так: у вас есть набор данных A и набор данных B, оба имеют один и тот же ключ, скажем, LongWritable.

  1. Запустите два задания, которые сортируютдва набора данных по их ключам, оба задания ДОЛЖНЫ установить равное число редукторов, скажем, 2.
  2. это приведет к 2 отсортированным файлам для каждого набора данных
  3. теперь вы настраиваете свою работу, которая присоединяется к наборам данных, эта работа будет появляться с 2 мапперами.Это может быть больше, если вы устанавливаете уменьшающие числа выше в предыдущем задании.
  4. делайте все, что вам нравится на шаге уменьшения.

Если количество файлов будетjoin не равен, это приведет к исключению при настройке задания.

Установка объединения довольно болезненна, в основном потому, что вам нужно использовать старый API для мапперов и редукторов, если ваша версия меньше 0,21.x.

Этот документ очень хорошо описывает, как он работает. Прокрутите весь путь до конца, к сожалению, эта документация почему-то отсутствует в последних документах Hadoop.

Другойхороший справочник - «Hadoop The Definitive Guide», который объясняет все это более подробно и с примерами.

1 голос
/ 15 июня 2011

Я думаю, вы упускаете суть. Вы не контролируете количество картографов. Это количество редукторов, которые вы можете контролировать. Просто отправьте правильные ключи из вашего картографа. Затем запустите 10 редукторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...