MapReduce (вторичная) сортировка / фильтрация - как? - PullRequest
1 голос
/ 01 апреля 2011

У меня есть журнал значений меток времени (одновременных пользователей) разных «зон» веб-приложения чата в формате «Метка времени; Зона; Значение».Для каждой зоны существует одно значение в минуту каждого дня.

Для каждой зоны я хочу перечислить максимальное значение за день, упорядоченное по этому максимальному значению

Итак, входной файл

#timestamp; zone; value
2011-01-01 00:00:00; 1; 10
2011-01-01 00:00:00; 2; 22
2011-01-01 00:01:00; 1; 11
2011-01-01 00:01:00; 2; 21

2011-01-02 00:00:00; 1; 12
2011-01-02 00:00:00; 2; 20

должен производить для зоны 1:

2011-01-02    12
2011-01-01    11

и для зоны 2:

2011-01-01    22
2011-01-02    20

Как бы я подошел к этому?ИМХО, мне понадобится более одного шага M / R.

До сих пор я реализовал:

  • Картограф, который собирает текстовую клавишу "YYYY-MM-DD /Zone "и значение IntWritable" value "и
  • Редуктор, который определяет максимальное значение для ключа (т. Е. Для каждой зоны в день).

В результате получается файл типа

2011-01-01/1    11
2011-01-01/2    22
2011-01-02/1    12
2011-01-02/2    20

Будет ли это вход для второго шага M / R?Если так, что я бы взял за ключ и значение?

Я изучил пример «Вторичная сортировка» в «Hadoop - Полное руководство», но я не уверен, применять ли это здесь и как.

Можно ли выполнить M / R в несколько выходных файлов (по одному на зону)?

ОБНОВЛЕНИЕ Подумав об этом, я попробую следующее:

  • сделать ключ составным из идентификатора зоны и значения (используя IntPair?)
  • написание пользовательского KeyComparator и GroupComparator

Ответы [ 3 ]

7 голосов
/ 09 апреля 2011

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

  1. Определите ключ как объединение зоны, гггг-мм-дд и значение как зона: гггг-мм-дд: значение Как я объясню, вы недаже нужно выбросить любое значение из картографа.NullWritable достаточно для значения

  2. Реализуйте ключевой компаратор так, чтобы зона: часть гггг-мм-дд упорядочивалась по возрастанию, а часть значений - по убыванию.Это обеспечит, что для всех ключей для данной зоны: гггг-мм-дд первый ключ в группе будет иметь наибольшее значение

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

  4. На входе редуктора вы получите первый ключ для группы ключей, которая будет содержатьзона, день и максимальное значение для этой зоны, дневная комбинация.Часть значения ввода редуктора будет списком NullWritable, который можно игнорировать.

0 голосов
/ 02 апреля 2011

Вторичная сортировка в Map Reduce решается с помощью составного шаблона ключей, поэтому вы создаете ключ, такой как (ZoneId, TImeStamp), и в редукторе вы сначала выполняете итерации по часовому поясу, а затем по временным меткам, чтобы вы могли легко оценить максимум за день.1001 *

0 голосов
/ 01 апреля 2011

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

Я бы, вероятно, разделил его по зонам, а затем каждая зона возвращала бы список самых высоких элементов по дням, посколькусокращение было бы действительно легко в этом пункте.Чтобы действительно получить выгоду от другого шага карты / сокращения, вам нужно иметь действительно большой набор данных и множество машин, которые можно разделить - и тогда я, вероятно, уменьшу весь ключ.

...