Записывает корреляцию/кластеризацию с использованием Hadoop

Наш кластер Hadoop ежедневно обрабатывает несколько терабайт веб-журналов. Каждая запись журнала содержит такую ​​информацию, как IP-адрес пользователя, идентификатор файла cookie и т. д. Однако одному физическому пользователю (домашнему/рабочему компьютеру и т. д.) могут соответствовать разные IP-адреса и идентификаторы файлов cookie. Мы разработали функцию, которая вычисляет оценку совпадения для любой пары записей, более высокая оценка означает более высокую вероятность того, что обе записи соответствуют одному физическому пользователю.

Цель состоит в том, чтобы разделить все записи на группы, которые предположительно соответствуют одному физическому пользователю, используя функцию оценки, и пометить все записи в группе уникальным идентификатором группы (т. е. идентификатором физического пользователя). Как лучше всего реализовать эту логику с помощью Hadoop/Mahout?


person user1128016    schedule 18.07.2013    source источник


Ответы (1)


Для начала я предполагаю, что вы знаете, как связывать задания MapReduce. Если нет, см. http://developer.yahoo.com/hadoop/tutorial/module4.html#chaining для получения подробной информации.

Во-вторых, я предполагаю, что у вас есть распределенное хранилище ключей/значений, такое как Cassandra.

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

Теперь, что было бы теоретически хорошим способом решить вашу проблему?

  1. Обработайте журналы, поместите в свой магазин карту уникального идентификатора машины (IP-адрес + cookie) + диапазон дат для всех зарегистрированных событий.

  2. Извлеките список всех уникальных идентификаторов машин. Сохраните и это.

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

  4. Вывод 3 передается по конвейеру в карту, чья карта ничего не делает, и чья карта находит для каждого идентификатора машины наименьший идентификатор машины, с которым он сопоставляется.

  5. Вывод 4 перенаправляется на уменьшение карты, карта которого принимает пару (идентификатор машины, канонический идентификатор машины), захватывает события из хранилища в # 1 и переназначает их в (канонический идентификатор машины, остальная часть события), и чье сокращение хранит для канонического идентификатора машины (он же идентификатор группы) связанные события. (По дате, если хотите.)

Хорошо, это хорошая теория. Где это идет не так?

Проблема в том, что всех пар идентификаторов чертовски много. В этом списке может оказаться порядка 1018, для каждого из которых вы извлекаете журналы. Если у вас нет действительно феноменального оборудования, вам не хватит вычислительной мощности, чтобы вычислить это. Поэтому вам нужно найти эвристики, чтобы уменьшить его.

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

Во-вторых, после большой первоначальной работы вы, вероятно, сойдете с рук: «Из всех недавно созданных идентификаторов, на что они сопоставляются?» Это кандидаты на добавление к вашему каноническому отображению, которое вы не хотите постоянно воссоздавать.

В-третьих, я уверен, что у вас есть понятие "подобная запись". Таким образом, сопоставьте записи с какой-то группой записей, а затем при сокращении все «достаточно маленькие» группы сопоставят все пары «возможно, одинаковыми». Отправьте эти пары в сокращение карты, которое захватывает «возможно, одни и те же» записи, а затем создает идентификатор машины сопоставления поиска для всех «появившихся, возможно, одинаковых более чем X раз». Сохраните это. Теперь повторите вышеописанное, за исключением того, что на шаге 2 вы отправляете идентификатор машины всем парам себя с «пришедшим, возможно, таким же» другим. Этот ярлык значительно сократит работу.

Это общая стратегия, которая требует много работы. Удачи.

person btilly    schedule 18.07.2013