hadoop + один ключ к каждому редуктору - PullRequest
3 голосов
/ 19 сентября 2010

Есть ли способ в Hadoop гарантировать, что каждый редуктор получает только один ключ, который выводится картографом?

Ответы [ 4 ]

6 голосов
/ 19 сентября 2010

Этот вопрос для меня немного неясен.Но я думаю, что у меня есть достаточно хорошее представление о том, что вы хотите.

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

Я предполагаю, что вы хотите убедиться, что каждый редуктор получает ровно одну «пару ключ-значение».По сути, есть два способа сделать это:

  1. Убедитесь в отображении, что все ключи, которые выводятся, являются уникальными.Таким образом, для каждого ключа есть только одно значение.
  2. Заставьте редуктор сделать это, заставив групповой компаратор, который просто классифицирует все ключи как разные.

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


Из-за других ответов в этом вопросе я добавляю немного больше деталей:

Для сравнения ключей используются 3 метода (я извлек эти примеры кода из проекта, который я делал с использованием API 0.18.3):

Partitioner

    conf.setPartitionerClass(KeyPartitioner.class);

Разделитель предназначен только для того, чтобы «вещи, которые должны быть одинаковыми, попадали в один и тот же раздел».Если у вас 1 компьютер, то есть только один раздел, так что это мало поможет.

Key Comparator

    conf.setOutputKeyComparatorClass(KeyComparator.class);

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

Компаратор группы

    conf.setOutputValueGroupingComparator(GroupComparator.class);

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

HTH

1 голос
/ 19 сентября 2010

Вы можете получить некоторый контроль над тем, какие ключи отправляются на какие редукторы, внедрив интерфейс Partitioner

Из документации Hadoop API:

Partitioner управляет разбиением ключейпромежуточные карты-выходы.Ключ (или подмножество ключа) используется для получения раздела, обычно с помощью хэш-функции.Общее количество разделов совпадает с количеством задач сокращения для задания.Следовательно, это контролирует, какую из задач по сокращению промежуточный ключ (и, следовательно, запись) отправляет для сокращения.

Следующая книга проделывает большую работу по описанию разделения, стратегий сортировки ключей и компромиссов вместе сдругие проблемы в карте уменьшают дизайн алгоритма: http://www.umiacs.umd.edu/~jimmylin/book.html

0 голосов
/ 20 марта 2011

Вы уверены, что хотите это сделать? Можете ли вы разработать свою проблему, чтобы я мог понять почему вы хотите это сделать.

Вы должны сделать две вещи, как упоминалось в предыдущих ответах

  1. Напишите разделитель так, чтобы каждый ключ ассоциировался с уникальным редуктором.
  2. Убедитесь, что количество слотов редуктора в вашем кластере больше или равно на количество уникальных ключей у вас будет

Pranab

0 голосов
/ 19 сентября 2010

Я думаю, что то же самое, что и выше, просто вы можете отсортировать ключи, если это возможно, и попытаться назначить им редуктор на основе ваших критериев разделения, см. Youtube mapreduce ucb 61a лекция-34, они говорят об этом.

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