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