Настройте соединение на стороне карты для нескольких картографов в Hadoop Map/Reduce

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

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

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

Ши


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

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

/A/dataA-r-00000

/A/dataA-r-00001

/B/dataB-r-00000

/B/dataB-r-00001

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

внутренний(tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,"/A/dataA-r-00000"),tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,"/B/dataB-r-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);

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


person Shi Yu    schedule 12.06.2011    source источник


Ответы (2)


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

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

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

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

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

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

Настройка соединения довольно болезненна, в основном потому, что вам нужно использовать старый API для картографа и редуктора, если ваша версия меньше 0.21.x.

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

Еще одним хорошим справочником является «Hadoop the Definitive Guide», в котором все это объясняется более подробно и с примерами.

person Thomas Jungblut    schedule 15.06.2011

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

person David Medinets    schedule 15.06.2011
comment
уверен, что можно контролировать количество картографов, вы должны поместить n-файлы во входные каталоги и отправить как файл в формате ввода. - person Thomas Jungblut; 15.06.2011