Нахождение совпадающих строк с Hadoop / MapReduce - PullRequest
4 голосов
/ 06 февраля 2010

Я играю с Hadoop и настроил двухузловой кластер в Ubuntu. Пример WordCount работает просто отлично.

Теперь я хотел бы написать свою собственную программу MapReduce для анализа некоторых данных журнала (основная причина: это выглядит просто, и у меня много данных)

Каждая строка в журнале имеет этот формат

<UUID> <Event> <Timestamp>

где событие может быть INIT, START, STOP, ERROR и некоторые другие. Больше всего меня интересует прошедшее время между событиями START и STOP для одного и того же UUID.

Например, мой журнал содержит записи, подобные этим

35FAA840-1299-11DF-8A39-0800200C9A66 START 1265403584
[...many other lines...]
35FAA840-1299-11DF-8A39-0800200C9A66 STOP 1265403777

Моя текущая линейная программа читает файлы, запоминает начальные события в памяти и записывает истекшее время в файл, как только обнаружил соответствующее конечное событие (строки с другими событиями в настоящее время игнорируются, события ERROR делают недействительным UUID и это тоже будет игнорироваться) 1

Я бы хотел перенести это в программу Hadoop / MapReduce. Но я не уверен, как сделать сопоставление записей. Разбить / разбить файл на файл легко, и я думаю, что поиск совпадений будет редуцирующим классом. Но как это будет выглядеть? Как мне найти записи о сопоставлении в задании MapReduce?

Пожалуйста, имейте в виду, что моя основная задача - понять Hadopo / MapReduce; приветствуются ссылки на Pig и другие программы Apache, но я бы хотел решить эту проблему с помощью чистого Hadoop / MapReduce. Спасибо.

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

Ответы [ 2 ]

8 голосов
/ 06 февраля 2010

Если вы выберете UUID на карте в качестве ключа: emit(<uuid>, <event, timestamp>) вы получите в своем сокращении все события этого UUID: key = UUID, values = {<event1, timestamp1>, <event2, timestamp2>}

Затем вы можете отсортировать события по временной отметке и решить, следует ли их отправлять в результирующий файл или нет.

Бонус: вы можете использовать job.setSortComparatorClass(); для установки собственного класса сортировки, так что вы получите свои записи уже отсортированными по их временным меткам при уменьшении:

public static class BNLSortComparator extends Text.Comparator {
  public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
    String sb1, sb2;
    try {
      sb1 = Text.decode(b1, s1, l1);
      ...
3 голосов
/ 06 февраля 2010

Я думаю, что вы могли бы сделать это, заставив вашу функцию карты вывести UUID в качестве его ключа, а остальную часть строки в качестве его значения. Затем функции Reduce будет передан набор всех записей журнала с одинаковым UUID. Обрабатывая их, он может отслеживать различные события, которые он видит, и предпринимать соответствующие действия - например, когда он видит событие START, он может установить локальную переменную на время, извлеченное из строки старта, а затем, когда он видит STOP событие, которое может извлечь из него время, вычесть время начала и вывести разницу (и поступит аналогично, если увидит ОСТАНОВ до начала).

...