Класс Hadoop Combiner для текста

Я все еще пытаюсь интуитивно понять, когда использовать класс объединителя Hadoop (я видел несколько статей, но они конкретно не помогли в моей ситуации).

Мой вопрос: уместно ли использовать класс объединителя, когда значение пары принадлежит классу Text? Например, предположим, что у нас есть следующий вывод от картографа:

fruit apple
fruit orange
fruit banana
...
veggie carrot
veggie celery
...

Можем ли мы применить здесь класс объединителя:

fruit apple orange banana
...
veggie carrot celery
...

еще до того, как он достигнет редуктора?


person honeywind    schedule 08.04.2012    source источник
comment
Эм, если вы хотите, чтобы ваш редюсер получал ваши данные... тогда да.   -  person Brian Roach    schedule 08.04.2012
comment
@BrianRoach Редуктор в основном делает то, что сделал бы объединитель, если бы это было возможно. Не могли бы вы уточнить свой ответ? В качестве отказа от ответственности, у меня есть задание, и мой профессор спрашивает нас, почему класс объединителя нельзя ввести в ситуацию, аналогичную приведенному выше примеру. Однако мне кажется, что можно, поэтому и спрашиваю.   -  person honeywind    schedule 08.04.2012


Ответы (2)


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

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

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

Вы можете столкнуться с проблемой, если хотите отсортировать и дедуплицировать выходной список, поскольку логика объединителя/редуктора должна будет разбить объект Text обратно на слова, отсортировать и дедуплицировать список, а затем перестроить список слов.

Чтобы прямо ответить на ваш вопрос - когда это будет уместно, я могу привести несколько примеров:

  • Если вы хотите найти лексикографическое наименьшее или наибольшее значение, связанное с каждым ключом
  • У вас есть миллионы значений для каждого ключа, и вы хотите «случайно» выбрать небольшой набор значений.
person Chris White    schedule 09.04.2012
comment
Спасибо, это было отличное объяснение. Вы действительно попали в цель для моей ситуации, так как класс объединителя ввел бы дубликаты. - person honeywind; 09.04.2012

Класс Combiner используется, когда есть ситуация для использования коммутативного или ассоциативного подхода. Коммутативный пример:

abc=cba во время выполнения задачи объединения (a*b=d),c, а затем отправить значение d,c в редуктор. Теперь редюсер должен выполнить только одну задачу вместо двух, т.е. a*b = d d*c, чтобы получить окончательный ответ. Если вы используете объединитель, нужно делать только d * c.

Точно так же для ассоциативного (a+b)+c = a+(b+c) Ассоциативный (группировка) и коммутативный (перемещение) результат не будет отличаться от того, как вы умножаете или добавляете. В основном объединитель используется для структурированных данных, которые подчиняются ассоциативным и коммутативным принципам.

Преимущество комбайна:

  • Это уменьшает сетевой ввод-вывод между картой и редуктором.
  • Это уменьшает дисковый ввод-вывод в редукторе, поскольку часть выполнения происходит в Comabiner.
person VG P    schedule 13.08.2014