Kuznetsov mapreduce urfu_2013
description
Transcript of Kuznetsov mapreduce urfu_2013
![Page 1: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/1.jpg)
Наглядный MapReduceДмитрий Кузнецов, Яндекс
91
![Page 2: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/2.jpg)
92
![Page 3: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/3.jpg)
Логи
music-front00$ head listen_1384096375.log !1384096375 user32873 song6544 1384096376 user59961 song9291 1384096377 user3187 song6544
93
![Page 4: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/4.jpg)
Рейтинг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
![Page 5: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/5.jpg)
Наивное решение 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
![Page 6: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/6.jpg)
Сервис растёт
Было
Стало
96
![Page 7: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/7.jpg)
Сервис растёт• Данные больше не помещаются в память
• Ограничить количество данных
:-( количество VS качество
• Купить ещё RAM
:-( временное решение
• Изменить способ обработки данных
97
![Page 8: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/8.jpg)
Шардирование
• Свою часть логов для каждой песни можно обрабатывать независимо от других
• Независимые вычисления можно производить на разных машинах4
• Независимые вычисления можно делать параллельно
98
![Page 9: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/9.jpg)
Шардирование
[ song1: 10 song2: 8 song3: 4 ]
[ song7: 9 song8: 4 song9: 3 ]
Осталось выполнить слияние ответов с каждой машины
99
![Page 10: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/10.jpg)
Всё хорошо, но есть нюансы:
• Надёжность вычислений • Надёжность хранения данных • Что если мы хотим что-то ещё посчитать по другому разбиению? • Хранить ещё одну копию данных • Можно пересылать данные между машинами перед
самим вычислением
Программировать это всё каждый раз заново?910
![Page 11: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/11.jpg)
MapReduce
• MapReduce: Простая модель, на которую хорошо ложится много задач
911
![Page 12: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/12.jpg)
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
![Page 13: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/13.jpg)
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
![Page 14: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/14.jpg)
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
![Page 15: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/15.jpg)
MapReducemap
map
map
reduce
reduce
reduce
(song1, 1) (song1, 1)
(song2, 1) (song3, 1)
(song1, 1) (song3, 1)
Особая магия M
apReduce
Исходные данные
915
![Page 16: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/16.jpg)
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
![Page 17: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/17.jpg)
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
![Page 18: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/18.jpg)
MapReduce
• Внутри реализации MapReduce можно спрятать много проблем, которые не придётся решать каждый раз заново:
• надёжность хранения данных • надёжность вычислений • оптимизация использования диска и сети • балансировка нагрузки
918
![Page 19: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/19.jpg)
MapReduce: у менеджера есть для вас новые задачи!
919
![Page 20: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/20.jpg)
MapReduce: немного посложнее
• Что такое “два пользователя похожи”?
!
!
920
![Page 21: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/21.jpg)
MapReduce: немного посложнее
• Что такое “два пользователя похожи”?
!
!
!
!
• AC/DC
• KISS • Black Sabbath
• Григорий Лепс
• Киркоров
J(Вася, Петя) = 0.4
Что любит ВасяЧто любит Петя
921
![Page 22: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/22.jpg)
MapReduce: немного посложнее
• Можно снова попробовать написать наивное решение с перебором всех пар
• O(n2) - время работы пропорционально квадрату от количества пользователей
• Если нашим сервисом пользуется 1 млн. пользователей (пользователей у Spotify > 20 млн), то (1 млн)2 = 1000000000000
922
![Page 23: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/23.jpg)
MapReduce: немного посложнее
• Давайте попытаемся сделать так, чтобы те пользователи, кто может с высокой вероятностью оказаться похожими, попадали в один reduce
• Для этого им следует назначить одинаковый ключ
• Внутри одного reduce’а мы сможем выполнить попарное сравнение
• Однако, мы не хотим допустить случая, когда число сраниваемых пар окажется слишком большим
923
![Page 24: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/24.jpg)
MinHash
Вася Петя … Тамара
AC/DC 1 1 … 0
KISS 1 0 … 0
Лепс 1 0 … 1
Киркоров 1 0 … 1
924
![Page 25: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/25.jpg)
MinHash
• .
Вася Петя … Тамара
Лепс 1 0 … 1
Киркоров 1 0 … 1
AC/DC 1 1 … 0
KISS 1 0 … 0
925
![Page 26: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/26.jpg)
MinHash
Вася Петя … Тамара
AC/DC 1 1 … 0
KISS 1 0 … 0
Лепс 1 0 … 1
Киркоров 1 0 … 1
MinHash: AC/DC AC/DC … Лепс
926
![Page 27: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/27.jpg)
MinHash
Вася Петя … Тамара
Лепс 1 0 … 1
Киркоров 1 0 … 1
AC/DC 1 1 … 0
KISS 1 0 … 0
MinHash: Лепс AC/DC … Лепс
927
![Page 28: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/28.jpg)
Посмотрим на строчки матрицы для Васи и ПетиВася Петя
0 11 01 01 11 10 0 Z
Y
XJ(Вася, Петя) = x / (x + y)
Pr{MinHash(Вася) = MinHash(Петя)} = x / (x + y)
928
![Page 29: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/29.jpg)
ВычисленияВася Петя … Тамара 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
![Page 30: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/30.jpg)
ВычисленияВася Петя … Тамара 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
![Page 31: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/31.jpg)
ВычисленияВася Петя … Тамара 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
![Page 32: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/32.jpg)
ВычисленияВася Петя … Тамара 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
![Page 33: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/33.jpg)
ВычисленияВася Петя … Тамара 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
![Page 34: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/34.jpg)
MinHash• У нас есть волшебная монетка (minhash)
• Если на ней выпал орёл, то тогда двум пользователям достаётся одинаковый ключ
• Чтобы повысить шансы совпадения, можно кидать несколько монеток (несколько хэш-функций)
• Но тогда будет много лишних пар с одним ключом?
934
![Page 35: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/35.jpg)
Хорошо, а где MapReduce?
Вася Петя … Тамара
корзинка 1 1 0 0 2 3 2 1 2 … …
корзинка 2 … … …
корзинка 3 … … …
935
![Page 36: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/36.jpg)
Хорошо, а где MapReduce?
См. книжку: Mining of Massive Datasets (Rajaraman, Ullman), глава 3
936
![Page 37: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/37.jpg)
MapReduce в Яндексе• Несколько больших кластеров
• Самый большой: более 1000 машин и более 5 петабайт данных
• Лекции про MapReduce:
• http://video.yandex.ru/users/ya-events/view/199
• http://tech.yandex.ru/events/yac/2013/talks/1091/
937
![Page 38: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/38.jpg)
MapReduce в Яндексе
• Обработка поисковых логов
• Подготовка саджеста (поисковых подсказок)
• Машинный перевод
• Исследовательская аналитика
938
![Page 39: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/39.jpg)
Хочу попробовать!
В университете есть маленький MapReduce-кластер (Hadoop)
939
![Page 40: Kuznetsov mapreduce urfu_2013](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cd196d8b42a7e5b8b527e/html5/thumbnails/40.jpg)
Спасибо!• Лекции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