Сделайте что-нибудь для всего списка значений Редуктора, основанного на одном элементе - PullRequest
0 голосов
/ 28 марта 2011

У меня есть интересная проблема, которую я пытаюсь вписать в MapReduce. У меня есть куча записей журнала. Что мне нужно сделать, это что-то вроде этого:

Проверьте, имеет ли какая-либо запись для данного IP установленный флаг. Если это так, примените преобразование к всем записям с этим IP, иначе не преобразовывайте.

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

Возможные решения, которые я вижу:

  1. В редукторе сериализуйте значения, которые я читаю на диск, чтобы потом можно было лениво десериализоваться, чтобы выполнить итерацию во второй раз. Это похоже на взлом.
  2. Заранее запустите какое-нибудь задание, которое генерирует список IP-адресов для преобразования, и сохраните его в HBase или что-то в этом роде. Это, очевидно, требует HBase и большого количества сетевых коммуникаций.

Я бы хотел придерживаться стандартного MapReduce, чтобы можно было легко работать на Amazon Elastic MapReduce. Я чувствую, что должен быть какой-то способ сделать это с помощью скованных работ, но я не могу ничего придумать. У кого-нибудь есть советы, как мне это сделать?

1 Ответ

2 голосов
/ 28 марта 2011

Одна возможность: ваши преобразователи могут вывести составной ключ, который включает в себя как IP-адрес, так и наличие этого конкретного флага. Затем вам нужно убедиться, что записи, которые вы перебираете в редукторе, отсортированы так, чтобы записи, где flag = true, появлялись первыми. Поскольку эти записи появляются первыми, вы будете знать, как применить преобразование ко всем записям в этой группе IP-адресов.

Вот запись в блоге, которая описывает, как это сделать:

http://www.riccomini.name/Topics/DistributedComputing/Hadoop/SortByValue/

...