kuznetsov mapreduce urfu_2013
DESCRIPTION
Дмитрий Кузнецов на Я.Студенте в УрФУ. Наглядный MapReduceTRANSCRIPT
Наглядный MapReduceДмитрий Кузнецов, Яндекс
91
92
Логи
music-front00$ head listen_1384096375.log !1384096375 user32873 song6544 1384096376 user59961 song9291 1384096377 user3187 song6544
93
Рейтинг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
Наивное решение 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
Сервис растёт
Было
Стало
96
Сервис растёт• Данные больше не помещаются в память
• Ограничить количество данных
:-( количество VS качество
• Купить ещё RAM
:-( временное решение
• Изменить способ обработки данных
97
Шардирование
• Свою часть логов для каждой песни можно обрабатывать независимо от других
• Независимые вычисления можно производить на разных машинах4
• Независимые вычисления можно делать параллельно
98
Шардирование
[ song1: 10 song2: 8 song3: 4 ]
[ song7: 9 song8: 4 song9: 3 ]
Осталось выполнить слияние ответов с каждой машины
99
Всё хорошо, но есть нюансы:
• Надёжность вычислений • Надёжность хранения данных • Что если мы хотим что-то ещё посчитать по другому разбиению? • Хранить ещё одну копию данных • Можно пересылать данные между машинами перед
самим вычислением
Программировать это всё каждый раз заново?910
MapReduce
• MapReduce: Простая модель, на которую хорошо ложится много задач
911
MapReduce!
!
Map:
!
!
!
function map(log_record) { timestamp, user, song = log_record.split emit(song, “1") }
Данные на входе: 1384096375 user32873 song1 1384096376 user59961 song2 1384096386 user59961 song3
Ответ: ( song1, 1 ) ( song2, 1 ) ( song3, 1 )
912
MapReduce!
!
!
• Reduce:
!
!
!
!
function reduce(song_id, [ ones ]) { count = 0 foreach c in ones { count = count + 1 } emit(song_id, count) }
( song1, 1 ) ( song1, 1 ) ( song2, 1 ) ( song3, 1 ) ( song3, 1 ) ( song3, 1 )
( song1, [1, 1] ) ( song2, [1] ) ( song3, [1, 1, 1] )
Особая магия MapReduce
Ответ: ( song1, 2 ) ( song2, 1 ) ( song3, 3 )
913
MapReduce• Map:
!
!
• Reduce:
!
!
function map(log_record) { timestamp, user, artist, song = log_record.split emit(artist, song) }
function reduce(artist, songs) { artist_songs = dict() foreach s in songs { artist_songs[s].increment() } emit(artist, most_popular(artist_songs)) }
914
MapReducemap
map
map
reduce
reduce
reduce
(song1, 1) (song1, 1)
(song2, 1) (song3, 1)
(song1, 1) (song3, 1)
Особая магия M
apReduce
Исходные данные
915
MapReducemap
map
map
reduce
reduce
reduce
(song1, 1) (song1, 1)
(song2, 1) (song3, 1)
(song1, 1) (song3, 1)
(song1, [1, 1])
(song2, [1])
(song3, [1, 1])Особая магия M
apReduce
Исходные данные
916
MapReducemap
map
map
reduce
reduce
reduce
(song1, 1) (song1, 1)
(song2, 1) (song3, 1)
(song1, 1) (song3, 1)
(song1, [1, 1])
(song2, [1])
(song3, [1, 1])
(song1, 2)
(song2, 1)
(song3, 2)
Особая магия M
apReduce
Исходные данные
917
MapReduce
• Внутри реализации MapReduce можно спрятать много проблем, которые не придётся решать каждый раз заново:
• надёжность хранения данных • надёжность вычислений • оптимизация использования диска и сети • балансировка нагрузки
918
MapReduce: у менеджера есть для вас новые задачи!
919
MapReduce: немного посложнее
• Что такое “два пользователя похожи”?
!
!
920
MapReduce: немного посложнее
• Что такое “два пользователя похожи”?
!
!
!
!
• AC/DC
• KISS • Black Sabbath
• Григорий Лепс
• Киркоров
J(Вася, Петя) = 0.4
Что любит ВасяЧто любит Петя
921
MapReduce: немного посложнее
• Можно снова попробовать написать наивное решение с перебором всех пар
• O(n2) - время работы пропорционально квадрату от количества пользователей
• Если нашим сервисом пользуется 1 млн. пользователей (пользователей у Spotify > 20 млн), то (1 млн)2 = 1000000000000
922
MapReduce: немного посложнее
• Давайте попытаемся сделать так, чтобы те пользователи, кто может с высокой вероятностью оказаться похожими, попадали в один reduce
• Для этого им следует назначить одинаковый ключ
• Внутри одного reduce’а мы сможем выполнить попарное сравнение
• Однако, мы не хотим допустить случая, когда число сраниваемых пар окажется слишком большим
923
MinHash
Вася Петя … Тамара
AC/DC 1 1 … 0
KISS 1 0 … 0
Лепс 1 0 … 1
Киркоров 1 0 … 1
924
MinHash
• .
Вася Петя … Тамара
Лепс 1 0 … 1
Киркоров 1 0 … 1
AC/DC 1 1 … 0
KISS 1 0 … 0
925
MinHash
Вася Петя … Тамара
AC/DC 1 1 … 0
KISS 1 0 … 0
Лепс 1 0 … 1
Киркоров 1 0 … 1
MinHash: AC/DC AC/DC … Лепс
926
MinHash
Вася Петя … Тамара
Лепс 1 0 … 1
Киркоров 1 0 … 1
AC/DC 1 1 … 0
KISS 1 0 … 0
MinHash: Лепс AC/DC … Лепс
927
Посмотрим на строчки матрицы для Васи и ПетиВася Петя
0 11 01 01 11 10 0 Z
Y
XJ(Вася, Петя) = x / (x + y)
Pr{MinHash(Вася) = MinHash(Петя)} = x / (x + y)
928
ВычисленияВася Петя … Тамара h1 h2
0 (Лепс) 1 0 … 1 1 0
1 (Киркоров) 1 0 … 1 2 3
2 (AC/DC) 1 1 … 0 0 1
3 (KISS) 1 0 … 0 3 2
929
ВычисленияВася Петя … Тамара h1 h2
0 (Лепс) 1 0 … 1 1 0
1 (Киркоров) 1 0 … 1 2 3
2 (AC/DC) 1 1 … 0 0 1
3 (KISS) 1 0 … 0 3 2
h1 - - - -
h2 - - - -
930
ВычисленияВася Петя … Тамара h1 h2
0 (Лепс) 1 0 … 1 1 2
1 (Киркоров) 1 0 … 1 2 3
2 (AC/DC) 1 1 … 0 0 1
3 (KISS) 1 0 … 0 3 1
h1 1 - - 1
h2 2 2 - -
931
ВычисленияВася Петя … Тамара h1 h2
0 (Лепс) 1 0 … 1 1 2
1 (Киркоров) 1 0 … 1 2 3
2 (AC/DC) 1 1 … 0 0 1
3 (KISS) 1 0 … 0 3 1
h1 1 2 - 1
h2 2 2 - -
932
ВычисленияВася Петя … Тамара h1 h2
0 (Лепс) 1 0 … 1 1 2
1 (Киркоров) 1 0 … 1 2 3
2 (AC/DC) 1 1 … 0 0 1
3 (KISS) 1 0 … 0 3 1
h1 0 2 - 0
h2 1 2 - 1
933
MinHash• У нас есть волшебная монетка (minhash)
• Если на ней выпал орёл, то тогда двум пользователям достаётся одинаковый ключ
• Чтобы повысить шансы совпадения, можно кидать несколько монеток (несколько хэш-функций)
• Но тогда будет много лишних пар с одним ключом?
934
Хорошо, а где MapReduce?
Вася Петя … Тамара
корзинка 1 1 0 0 2 3 2 1 2 … …
корзинка 2 … … …
корзинка 3 … … …
935
Хорошо, а где MapReduce?
См. книжку: Mining of Massive Datasets (Rajaraman, Ullman), глава 3
936
MapReduce в Яндексе• Несколько больших кластеров
• Самый большой: более 1000 машин и более 5 петабайт данных
• Лекции про MapReduce:
• http://video.yandex.ru/users/ya-events/view/199
• http://tech.yandex.ru/events/yac/2013/talks/1091/
937
MapReduce в Яндексе
• Обработка поисковых логов
• Подготовка саджеста (поисковых подсказок)
• Машинный перевод
• Исследовательская аналитика
938
Хочу попробовать!
В университете есть маленький MapReduce-кластер (Hadoop)
939
Спасибо!• Лекции4
• MapReduce в Яндексе: http://bit.ly/1e1GMjR
• Yandex Table: http://bit.ly/18QRxDo
• Оффлайн-поиск на основе MapReduce: http://bit.ly/17S2Eze
• Книжки4
• Mining of Massive Datasets: http://stanford.io/hMPF31
• MapReduce Design Patterns: http://amzn.to/1gGJ3EB
• Hadoop: The Defenitive Guide: http://amzn.to/1hDkRVc
940