4. Рейтинг
1
AC/DC: Highway to
Hell
> 200 тысяч
прослушиваний
2
Филипп Киркоров:
зайка
>150 тысяч
3
Black Sabbath: Iron
Man
>120 тысяч
4
KISS: I Was Made for
Lovin’ You
> 90 тысяч
5
Григорий Лепс:
купола
> 80 тысяч
94
5. Наивное решение
1384096375 user32873 song6544
1384096376 user59961 song9291
!
!
count = {}
for line in logfile:
timestamp, user, song = line.rstrip().split(“t”)
count[song] = count.get(song, 0) + 1
!
r = sorted(count.iteritems(), key=lambda (k, v): -v)
for song, c in r:
print song, c
!
!
song6544 120
song9291 87
song1324 61
95
7. Сервис растёт
•
Данные больше не помещаются в память
•
Ограничить количество данных
:-( количество VS качество
•
Купить ещё RAM
:-( временное решение
•
Изменить способ обработки данных
97
8. Шардирование
•
Свою часть логов для каждой песни можно
обрабатывать независимо от других
•
Независимые вычисления можно производить на
разных машинах4
•
Независимые вычисления можно делать
параллельно
98
10. Всё хорошо, но есть нюансы:
•
Надёжность вычислений
•
Надёжность хранения данных
•
Что если мы хотим что-то ещё посчитать по
другому разбиению?
•
Хранить ещё одну копию данных
•
Можно пересылать данные между машинами перед
самим вычислением
Программировать это всё каждый раз заново?
910
18. MapReduce
•
Внутри реализации MapReduce можно спрятать
много проблем, которые не придётся решать
каждый раз заново:
•
надёжность хранения данных
•
надёжность вычислений
•
оптимизация использования диска и сети
•
балансировка нагрузки
918
21. MapReduce: немного посложнее
•
Что такое “два пользователя похожи”?
Что любит Петя
!
Что любит Вася
AC/DC
•
!
!
•
Киркоров
•
•
KISS
•
Black Sabbath
Григорий Лепс
!
J(Вася, Петя) = 0.4
921
22. MapReduce: немного посложнее
•
Можно снова попробовать написать наивное
решение с перебором всех пар
•
O(n2) - время работы пропорционально
квадрату от количества пользователей
•
Если нашим сервисом пользуется 1 млн.
пользователей (пользователей у Spotify > 20 млн), то
(1 млн)2 = 1000000000000
922
23. MapReduce: немного посложнее
•
Давайте попытаемся сделать так, чтобы те
пользователи, кто может с высокой вероятностью
оказаться похожими, попадали в один reduce
•
•
•
Для этого им следует назначить одинаковый ключ
Внутри одного reduce’а мы сможем выполнить попарное
сравнение
Однако, мы не хотим допустить случая, когда
число сраниваемых пар окажется слишком
большим
923
34. MinHash
•
У нас есть волшебная монетка (minhash)
•
Если на ней выпал орёл, то тогда двум
пользователям достаётся одинаковый ключ
•
Чтобы повысить шансы совпадения, можно кидать
несколько монеток (несколько хэш-функций)
•
Но тогда будет много лишних пар с одним ключом?
934
36. Хорошо, а где MapReduce?
См. книжку: Mining of Massive Datasets (Rajaraman, Ullman), глава 3
936
37. MapReduce в Яндексе
•
Несколько больших кластеров
•
Самый большой: более 1000 машин и более 5
петабайт данных
•
Лекции про MapReduce:
•
http://video.yandex.ru/users/ya-events/view/199
•
http://tech.yandex.ru/events/yac/2013/talks/1091/
937
38. MapReduce в Яндексе
•
Обработка поисковых логов
•
Подготовка саджеста (поисковых подсказок)
•
Машинный перевод
•
Исследовательская аналитика
938