У меня есть вопрос о настройке внутреннего соединения 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);
Итак, одним словом, как мне создать правильное выражение, если я хочу использовать больше картографов для объединения нескольких пар файлов одновременно?