Объединение Hadoop на стороне карты реализует Hash join? - PullRequest
3 голосов
/ 13 мая 2010

Я пытаюсь реализовать Hash join в Hadoop.

Однако в Hadoop уже есть соединение на стороне карты и соединение на стороне уменьшения уже реализовано.

В чем разница между этими методами и хэш-соединением?

Ответы [ 2 ]

7 голосов
/ 03 июня 2010

Присоединение к карте

При объединении на стороне карты (фрагмент-копия) вы удерживаете один набор данных в памяти (скажем, в хэш-таблице) и присоединяетесь к другому набору данных, запись за записью. В Pig вы бы написали

edges_from_list = JOIN a_follows_b BY user_a_id, some_list BY user_id using 'replicated';

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

Уменьшение присоединения

В соединении на стороне сокращения вы группируете по ключу соединения, используя стандартную сортировку слиянием hadoop.

<user_id   {A, B, F, ..., Z},  { A, C, G, ..., Q} >

и создать запись для каждой пары элементов из первого набора с элементом из второго набора:

[A   user_id    A]
[A   user_id    C]
...
[A   user_id    Q]
...
[Z   user_id    Q]

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

Обратите внимание, что для присоединения на стороне карты всего меньшего набора данных должно помещаться в памяти. В стандартном соединении на стороне редукции в память должны помещаться только группы каждого ключа (фактически, каждая группа ключей, кроме последней). Можно даже обойти это ограничение, но оно требует осторожности; посмотрите, например, скошенное соединение в Pig.

Объединить объединение

Наконец, если оба набора данных хранятся в порядке сортировки итогов на ключе соединения, вы можете выполнить объединение слиянием на стороне карты. Аналогично соединению на стороне редукции, вы выполняете сортировку слиянием для cogroup на ключе соединения, а затем проецируете (выравниваете) обратно на пары.

Из-за этого при генерации часто читаемого набора данных часто хорошей идеей является полная сортировка в последнем проходе. Зебра и другие базы данных могут также предоставить вам полностью отсортированный ввод (почти) бесплатно.

0 голосов
/ 12 июня 2014

Оба эти объединения Hadoop являются объединениями слиянием, для которых требуется (явная) сортировка заранее. Hash join, с другой стороны, не требует сортировки, а разделяет данные с помощью некоторой хэш-функции. Подробное обсуждение можно найти в разделе «Реляционные объединения» в Интенсивной обработке текста с помощью MapReduce , написанной Джимми Линем и Крисом Дайером, хорошо написанной книгой с открытым исходным кодом.

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