Big Data: первые шаги
Антон Горохов
2013
Повестка дня
• Большие Данные – откуда они?
• … в интернете.
• Область применения: статистика
• Классические алгоритмы
• MapReduce
• Приближенные вычисления
Откуда данные?

etc.
Признаки больших данных – 3V
• Volume – объем
• >> объема 1 HDD
• Velocity – скорость
• > 10000 событий в секунду
• Variability – разнообразие
• текст, разные форматы
• изображения (графика + EXIF)
• видео
• звук
Интернет
анализ
настроений

поиск

колаборативная
фильтрация

статистика

аналитика
социальный
поиск

маркетинговые
исследования

контекстная
реклама

персонализация
Статистика
• Сколько посетителей, их характеристики
▫ география
▫ источники посещений (закладки, поиск, реклама, соц.сети, …)
▫ сколько страниц посмотрели

• Новые / постоянные посетители
▫ как часто возвращаются

• Достижение целей
▫ покупки
▫ просмотр > N страниц

• Технические характеристики (для дизайна и юзабилити)
• Интересы посетителей
▫ общая аудитория с другими сайтами

• Мониторинг сайта
Требования к статистике
• Полнота
▫ Что считать
 См. предыдущий слайд

• Скорость
▫ Realtime (оперативно)
▫ Offline (задержка в насколько часов,
день)
• Точность
▫ Максимально точно
▫ Приближенно
Пример: посещаемость по часам
Что это за сайты:
знакомства,
новости, почта?
Новости

Почта

Знакомства
Исходные данные – логи
89.169.243.120 - - [01/Apr/2012:00:00:02 +0400] "GET /13385393/
HTTP/1.1" 200 26404 "http://www.rambler.ru/" "Mozilla/5.0
(iPad; U; CPU OS 4_3_3 like Mac OS X; ru-ru)
AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2
Mobile/8J2 Safari/6533.18.5"
"ruid=000000014ED4E0AD34C5064F00E74901" "-" 1333224002.813
92.194.73.237 - - [01/Apr/2012:00:00:02 +0400] "GET /13389254/
HTTP/1.1" 200 25610 "http://www.rambler.ru/" "Mozilla/5.0
(Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0"
"ruid=0000001D4E779AAA4CCC66FC01D27601" "-" 1333224002.827
IP
время
URL
46.229.141.0 - - [01/Apr/2012:00:00:02 +0400] "GET /13389756/
HTTP/1.1" 200 26394 "http://www.rambler.ru/" "Opera/9.80
referer
браузер (User-Agent)
(Windows NT 5.1; U; Edition Yx; ru) Presto/2.10.229
Version/11.61" "ruid=000000014F5A413832E111430401FA01" "-"
cookie
1333224002.895
Задача: сколько уникальных?
0000002A4F776242285A553B01E8FC01
000000014ED4E0AD34C5064F00E74901
0000001D4E779AAA4CCC66FC01D27601
0000002A4F776242285A553B01E8FF01
0000002A4F776242285A553B01E8FD01
000000014F5A413832E111430401FA01
0000002A4F70C38B0B8F3B2300842701
05FE817949848B9300011D02F8CDF001
0000002A4F44135A990142CF007FE701
06199C9C4F043E2D000032F181E57A01
000000014D605672AED8116B03857501
00000BB94EDBCD4241CD2D1A0889D801
0000002A4F7762432A2555410201D301
0000002A4F7762432AB6553E01F6A101
0000002A4F77624310AD553802030601
000000014F75575E27308DC005855E01
05F656904F0578B60000080AD99ADC01
0000002A4F7762431890553701F95601
0000002A4F776243285A553B01E90101
05F9DAFE4ED2238B000179629AA20C01
060C116D4F6F995700002468D58B9001
0000002A4F77624316AB553F01F32501
000000014F0165D51EFB23200F37CA01
000000014F7761DABC730A5508D2A901
000000014F4E1AF776B57E5901B3E101
0000002A4F7762432C85554301FC8D01
sort, uniq
• $> sort cookies.txt
• int a[size];
qsort(a, size, sizeof(*a), compare_int);
• std::vector<uint64_t> v(size);
std::sort(v.begin(), v.end(), std::less<uint64_t>());
Быстрая сортировка (quicksort)
• Алгоритм:
▫ выбрать опорный
элемент
▫ partition
(перестановка элементов)
▫ то же самое для обеих частей
• Время работы: O(n log n) – средний случай
O(n2) – худший случай
• Модификации алгоритма:
▫ учет специфики данных
▫ рандомизация
▫ хвостовая рекурсия (Т.Кормен “Алгоритмы: построение и анализ”)
▫ композиция алгоритмов
Реализации сортировки
• qsort()
▫ опорный элемент – медиана из 3х (средний из первого,
центрального и последнего)

▫ partition – O(n); больший интервал – в стек, второй – в
процедуру partition
▫ интервалы длины ≤ M не сортируем вообще
▫ в конце – сортировка вставками всего массива
(Knuth's Algorithm Q)

• std::sort() – алгоритм Introsort
▫ quicksort
▫ heapsort на большой глубине рекурсии (> 2log n)
▫ сортировка вставками коротких массивов – O(n2)
 быстрее при малых n
 попадает в кеш процессора
Практические советы
• Полезно знать чем пользуешься
▫ приемы и хороший стиль
▫ подходы к разработке алгоритма
▫ http://www.pnambic.com/CPS/SortAnal/ - разбор sort.c

• Используйте стандартные решения
▫ велосипед уже изобретен
▫ проверен миллионами
▫ известно как работает и предсказуем
Область использования
• Сортированные массивы – для
неизменяющихся данных (batched
problems)
• Быстрый поиск
• Медленная вставка
Что делать, если данные меняются?
std::map, std::set
• Заполнение

std::map<uint64_t, uint64_t > users;
uint64_t user_id;
while(…) {
…
++ users[user_id];
// или users.insert(…) – см. С.Мейерс, “Эффективное
использование STL”
…
}
std::cout << users.size() << std::endl;

• Подходит для чередования вставок и поиска
(online proc.)
• Реализация – красно-черное дерево
Деревья
• Бинарное дерево поиска
< - налево
> - направо => сортировка, уникальность

• Высота от log n до n
• Необходимо балансировать
AVL-дерево: |hR – hL| ≤ 1
• Высота log n
• Поиск/вставка/удаление O(log n)
2-3-4 деревья
• 3 типа узлов: c 2мя, 3мя и 4мя связями
• Сбалансированность: все пустые
поддеревья – на одном
уровне
C
A

E,H,G

I

N,R

L,M

• Поиск – log N+1 узлов
• Вставка – макс. log N+1
разделений узлов
(в среднем < 1)
• Минусы: накладные расходы при работе с узлами
• см. Седжвик Р. «Алгоритмы на C++»

P

S,X
Красно-черное дерево
I
C

N,R

A

E,G,H

L,M

P

S,X

I
C

R

A

G

E

N

H

M

L

S

P

X
std::unordered_map, unordered_set
• Реализации
▫ Boost (www.boost.org)
▫ Std::tr1 – Technical Report 1 (2003)
▫ C++11 (2011)
• Тип: template < class Key, class T, class Hash = hash<Key> > unordered_map
std::unordered_map<uint64_t, uint64_t> users;
uint64_t user_id;
while(…) {
…
if ( (it = users.find ( user_id )) == users.end () )
users.insert (std::make_pair< uint64_t, uint64_t>(user_id, 1));
else
++ it->second;
…
}
std::cout << users.size() << std::endl;
Хеш-таблица
• Выбор hash – равномерно на [0...m-1]; число корзин - m
• hash(key) = key mod m
▫ m – простое
▫ m = 2p (в некоторых реализациях)
• Коллизии – цепочки
• Коэф. заполнения (load_factor): n/m
• Перестроение таблицы при заполнении
• Поиск O(1+n/m)
• Нет сортировки по ключу
• Управление
▫ max_load_factor(float z)
▫ reserve(int n)

• Стратегии выбора m, перестроения
▫ задается типом или объектом (Э.Гамма “Приемы объектноориентированного проектирования”, А.Александреску “Современное
проектирование на С++”)
Область использования
• RB-деревья и хеш-таблицы (Map/set,
unordered_map/set) – структуры данных в
памяти
• Подходят для изменяющихся данных
(online problems)
Что делать, если памяти не хватает?
Утилита sort
• $> cat users.txt | sort –o sorted.txt
users.txt
sort3GlEkK

sort91PmLZ

……………..…..

16
sort3GlEkK
……………………….
sorted.txt

sortKZkFrx
Внешняя сортировка
• Ограничение – только место на диске (х3)
• Чем больше дисков – тем лучше
• Варианты:
▫ способ разнесения файлов по дискам
▫ RAID0 (stripe)
▫ многопутевое слияние
 дерево или пирамида для выбора наименьшего
 прочие вариации: Д.Кнут, т.3

Что делать, если данных много и они меняются?
Berkeley DB
• Key-value (NoSQL)
• Версии
▫ 1.х – libc (университет Беркли, 1986)
▫ 2 – 4 – libdb (Sleepycat software, 1996)
▫ 5 – Oracle (2006)

•
•
•
•
•
•

Типы хранилищ: BTREE, HASH
На диске или в памяти
Кеш в памяти
Интерфейс: C, C++, Java
Unix-like, Windows
Много где используется
B-Tree

•
•
•
•

Много ключей в узле (обобщение 2-3-4 дерева)
Небольшая высота O(logt n+1)
Узел кратен странице файловой системы
Поиск значения или диапазона (невозможно в
хеш-таблице)
• Ключи отсортированы
Обзор
Batched problems
Online problems
• сортировка в
• дерево в памяти
памяти
▫ std::map, std::set
▫ qsort, std::sort
• хеш-таблица
• внешняя сортировка ▫ std::unordered_ma
▫ sort
p/set
• Berkeley DB (диск) • Berkeley DB (память)
Что дальше?
• Задача не помещается на один сервер
▫ большой объем данных (BigData!)
▫ ограничение CPU (одного ядра)
▫ отказ оборудования
• Разбиваем на независимые подзадачи
▫ Параллельные вычисления
▫ Race conditions
▫ Необходимость синхронизации
 mutex’ы
 семафоры
 условные переменные
Race conditions (гонки)
account = 100
Thread 1
…
account += 50

Результат:
account = 100; 50; 150

Thread 2
…
account -= 50
Функциональное программирование
• Не меняем данные, а создаем новые
• Все вычисления – функции, зависят только
от аргументов
• Такие программы проще распараллелить
• Языки: Lisp, Haskell, Erlang, …
Google, 2004
Идея MapReduce
• Пары (ключ; значение)
• Программа описывается путем определения
функций
▫ map: (in_key; in_value) -> [(out_key; intermediate_value)]
▫ reduce: (out_key; [intermediate_value]) -> out_value

• После map происходит группировка и
сортировка по ключу out_key
• Каждая reduce-задача работает со своим
множеством out_key
Схема вычислений

группировка и сортировка по ключу
Основные принципы
• Параллелизм
▫ map работает параллельно
▫ reduce – параллельно для разных out_key

• Узкое место – reduce только после map
• Локальность – обрабатываем там, где данные
• Отказоустойчивость
▫ перезапуск map неудачных или долгих задач
▫ перезапуск выполняющихся reduce

• Оптимизация
▫ зависшие map запускаем на свободных машинах
▫ combiner – reduce функция, которая работает на map
стадии (если ассоциативна и коммутативна)
Задача 1
Выбрать (посчитать) карты c
уникальными именами
• Ключ – имя карты; значение пусто
• Mapper – тождественный
• Reducer
▫ 1 reducer – uniq
▫ 1 reducer + 1 combiner – uniq
▫ N reducers + counters
 на выходе – N файлов с именами
Задача 2
Посчитать сумму очков карт черной
масти (T – 11, К – 4, Д – 3, В – 2, 10 – 10, ост. – 0)
• Ключ: имя + масть
• Mapper: карта -> очки (для красных – 0)
• Reducer: суммирование
• Combiner = reducer
или
• Только mapper, результат – в счетчике
Задача 3
Посчитать среднее число очков в каждой
масти (T – 11, К – 4, Д – 3, В – 2, 10 – 10, ост. – 0)
• Ключ: имя + масть
• Mapper: тождественный
• Combiner: нет
• Partitioner: по мастям
• Reducer: AVG
Недостатки MapReduce
• Только пакетная обработка (batched
problems)
• Большое время отклика (латентность)
• Универсальный инструмент, не оптимален
• В реальных задачах требуется несколько
map/reduce этапов
Кластер Hadoop
HDFS
(Hadoop Distributed File System)

• Иерархическая структура, управляется
namenode
• Файлы разбиваются на блоки (64 Mb)
• Файлы хранятся на узлах datanodes (3
реплики)
• Поиск “ближайшей” реплики с помощью
namenode
• Получение данных напрямую с datanode
Схема вычислений в Hadoop
Программирование для Hadoop
• Hadoop Java API
▫ реализовать классы Mapper, Reducer

• Streaming
▫ streaming.jar; взаимодействие через stdin/stdout

• Pipes
▫ C++, сокеты

• Запуск:
$> /usr/local/bin/hadoop jar UniqUsers.jar /logs
/result

▫ Streaming
$> hadoop jar /usr/local/hadoop/contrib
/streaming/hadoop-streaming*.jar –input /logs/ –
output /result –mapper cat –reducer “wc –l”
Надо быстро, но не точно
• Оценить параметра
• Получить качественные характеристики
(распределение по пользователей по
географии, по полу, …)
• Проверить гипотезу
• Отладить алгоритм, запрос к данным
• Сэкономить время

Как избежать больших данных?
Фильтр Блума (Bloom filter)
• Бертон Блум, 1970
• Быстрая проверка, что элемента во множестве точно нет
• Реализация:
▫ битовый массив длины m, k независимых хеш-функций
▫ каждый ключ – k
единиц в массиве
▫ Проверка положительна, если
везде единицы
• Операции над множествами – операции над битовыми
массивами
• Вероятность ложного срабатывания: (1 – e-kn/m)k
Сэмплирование
• Sampling или Выборочные исследования
• Раздел математической статистики
• Анализируем выборку из генеральной
совокупности
• Выборка: hash(userId) % N = k (например)
female, %
male, %

1/32
45,10
54,90

1/8
45,54
54,46

¼
45,90
54,10

full
45,29
54,71

• Ошибка – доверительный интервал с
заданным уровнем доверия (95%, 99%)

• см. Кокрен У. «Методы выборочного исследования»
Обзор
Пакетная обработка: точно
и качественно
• сортировка в памяти
▫ qsort, std::sort

• внешняя сортировка
▫ sort

• Berkeley DB (диск)
• MapReduce
Быстро, но приблизительно
• Фильтр Блума
• Сэмплирование

Online обработка: быстро и
точно
• дерево в памяти
▫ std::map, std::set

• хеш-таблица
▫ std::unordered_map/set

• Berkeley DB (память)
Антон Горохов
anton@rambler-co.ru

Big Data - первые шаги

  • 1.
    Big Data: первыешаги Антон Горохов 2013
  • 2.
    Повестка дня • БольшиеДанные – откуда они? • … в интернете. • Область применения: статистика • Классические алгоритмы • MapReduce • Приближенные вычисления
  • 3.
  • 4.
    Признаки больших данных– 3V • Volume – объем • >> объема 1 HDD • Velocity – скорость • > 10000 событий в секунду • Variability – разнообразие • текст, разные форматы • изображения (графика + EXIF) • видео • звук
  • 5.
  • 6.
    Статистика • Сколько посетителей,их характеристики ▫ география ▫ источники посещений (закладки, поиск, реклама, соц.сети, …) ▫ сколько страниц посмотрели • Новые / постоянные посетители ▫ как часто возвращаются • Достижение целей ▫ покупки ▫ просмотр > N страниц • Технические характеристики (для дизайна и юзабилити) • Интересы посетителей ▫ общая аудитория с другими сайтами • Мониторинг сайта
  • 7.
    Требования к статистике •Полнота ▫ Что считать  См. предыдущий слайд • Скорость ▫ Realtime (оперативно) ▫ Offline (задержка в насколько часов, день) • Точность ▫ Максимально точно ▫ Приближенно
  • 8.
    Пример: посещаемость почасам Что это за сайты: знакомства, новости, почта? Новости Почта Знакомства
  • 9.
    Исходные данные –логи 89.169.243.120 - - [01/Apr/2012:00:00:02 +0400] "GET /13385393/ HTTP/1.1" 200 26404 "http://www.rambler.ru/" "Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; ru-ru) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5" "ruid=000000014ED4E0AD34C5064F00E74901" "-" 1333224002.813 92.194.73.237 - - [01/Apr/2012:00:00:02 +0400] "GET /13389254/ HTTP/1.1" 200 25610 "http://www.rambler.ru/" "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0" "ruid=0000001D4E779AAA4CCC66FC01D27601" "-" 1333224002.827 IP время URL 46.229.141.0 - - [01/Apr/2012:00:00:02 +0400] "GET /13389756/ HTTP/1.1" 200 26394 "http://www.rambler.ru/" "Opera/9.80 referer браузер (User-Agent) (Windows NT 5.1; U; Edition Yx; ru) Presto/2.10.229 Version/11.61" "ruid=000000014F5A413832E111430401FA01" "-" cookie 1333224002.895
  • 10.
    Задача: сколько уникальных? 0000002A4F776242285A553B01E8FC01 000000014ED4E0AD34C5064F00E74901 0000001D4E779AAA4CCC66FC01D27601 0000002A4F776242285A553B01E8FF01 0000002A4F776242285A553B01E8FD01 000000014F5A413832E111430401FA01 0000002A4F70C38B0B8F3B2300842701 05FE817949848B9300011D02F8CDF001 0000002A4F44135A990142CF007FE701 06199C9C4F043E2D000032F181E57A01 000000014D605672AED8116B03857501 00000BB94EDBCD4241CD2D1A0889D801 0000002A4F7762432A2555410201D301 0000002A4F7762432AB6553E01F6A101 0000002A4F77624310AD553802030601 000000014F75575E27308DC005855E01 05F656904F0578B60000080AD99ADC01 0000002A4F7762431890553701F95601 0000002A4F776243285A553B01E90101 05F9DAFE4ED2238B000179629AA20C01 060C116D4F6F995700002468D58B9001 0000002A4F77624316AB553F01F32501 000000014F0165D51EFB23200F37CA01 000000014F7761DABC730A5508D2A901 000000014F4E1AF776B57E5901B3E101 0000002A4F7762432C85554301FC8D01
  • 11.
    sort, uniq • $>sort cookies.txt • int a[size]; qsort(a, size, sizeof(*a), compare_int); • std::vector<uint64_t> v(size); std::sort(v.begin(), v.end(), std::less<uint64_t>());
  • 12.
    Быстрая сортировка (quicksort) •Алгоритм: ▫ выбрать опорный элемент ▫ partition (перестановка элементов) ▫ то же самое для обеих частей • Время работы: O(n log n) – средний случай O(n2) – худший случай • Модификации алгоритма: ▫ учет специфики данных ▫ рандомизация ▫ хвостовая рекурсия (Т.Кормен “Алгоритмы: построение и анализ”) ▫ композиция алгоритмов
  • 13.
    Реализации сортировки • qsort() ▫опорный элемент – медиана из 3х (средний из первого, центрального и последнего) ▫ partition – O(n); больший интервал – в стек, второй – в процедуру partition ▫ интервалы длины ≤ M не сортируем вообще ▫ в конце – сортировка вставками всего массива (Knuth's Algorithm Q) • std::sort() – алгоритм Introsort ▫ quicksort ▫ heapsort на большой глубине рекурсии (> 2log n) ▫ сортировка вставками коротких массивов – O(n2)  быстрее при малых n  попадает в кеш процессора
  • 14.
    Практические советы • Полезнознать чем пользуешься ▫ приемы и хороший стиль ▫ подходы к разработке алгоритма ▫ http://www.pnambic.com/CPS/SortAnal/ - разбор sort.c • Используйте стандартные решения ▫ велосипед уже изобретен ▫ проверен миллионами ▫ известно как работает и предсказуем
  • 15.
    Область использования • Сортированныемассивы – для неизменяющихся данных (batched problems) • Быстрый поиск • Медленная вставка Что делать, если данные меняются?
  • 16.
    std::map, std::set • Заполнение std::map<uint64_t,uint64_t > users; uint64_t user_id; while(…) { … ++ users[user_id]; // или users.insert(…) – см. С.Мейерс, “Эффективное использование STL” … } std::cout << users.size() << std::endl; • Подходит для чередования вставок и поиска (online proc.) • Реализация – красно-черное дерево
  • 17.
    Деревья • Бинарное деревопоиска < - налево > - направо => сортировка, уникальность • Высота от log n до n • Необходимо балансировать AVL-дерево: |hR – hL| ≤ 1 • Высота log n • Поиск/вставка/удаление O(log n)
  • 18.
    2-3-4 деревья • 3типа узлов: c 2мя, 3мя и 4мя связями • Сбалансированность: все пустые поддеревья – на одном уровне C A E,H,G I N,R L,M • Поиск – log N+1 узлов • Вставка – макс. log N+1 разделений узлов (в среднем < 1) • Минусы: накладные расходы при работе с узлами • см. Седжвик Р. «Алгоритмы на C++» P S,X
  • 19.
  • 20.
    std::unordered_map, unordered_set • Реализации ▫Boost (www.boost.org) ▫ Std::tr1 – Technical Report 1 (2003) ▫ C++11 (2011) • Тип: template < class Key, class T, class Hash = hash<Key> > unordered_map std::unordered_map<uint64_t, uint64_t> users; uint64_t user_id; while(…) { … if ( (it = users.find ( user_id )) == users.end () ) users.insert (std::make_pair< uint64_t, uint64_t>(user_id, 1)); else ++ it->second; … } std::cout << users.size() << std::endl;
  • 21.
    Хеш-таблица • Выбор hash– равномерно на [0...m-1]; число корзин - m • hash(key) = key mod m ▫ m – простое ▫ m = 2p (в некоторых реализациях) • Коллизии – цепочки • Коэф. заполнения (load_factor): n/m • Перестроение таблицы при заполнении • Поиск O(1+n/m) • Нет сортировки по ключу • Управление ▫ max_load_factor(float z) ▫ reserve(int n) • Стратегии выбора m, перестроения ▫ задается типом или объектом (Э.Гамма “Приемы объектноориентированного проектирования”, А.Александреску “Современное проектирование на С++”)
  • 22.
    Область использования • RB-деревьяи хеш-таблицы (Map/set, unordered_map/set) – структуры данных в памяти • Подходят для изменяющихся данных (online problems) Что делать, если памяти не хватает?
  • 23.
    Утилита sort • $>cat users.txt | sort –o sorted.txt users.txt sort3GlEkK sort91PmLZ ……………..….. 16 sort3GlEkK ………………………. sorted.txt sortKZkFrx
  • 24.
    Внешняя сортировка • Ограничение– только место на диске (х3) • Чем больше дисков – тем лучше • Варианты: ▫ способ разнесения файлов по дискам ▫ RAID0 (stripe) ▫ многопутевое слияние  дерево или пирамида для выбора наименьшего  прочие вариации: Д.Кнут, т.3 Что делать, если данных много и они меняются?
  • 25.
    Berkeley DB • Key-value(NoSQL) • Версии ▫ 1.х – libc (университет Беркли, 1986) ▫ 2 – 4 – libdb (Sleepycat software, 1996) ▫ 5 – Oracle (2006) • • • • • • Типы хранилищ: BTREE, HASH На диске или в памяти Кеш в памяти Интерфейс: C, C++, Java Unix-like, Windows Много где используется
  • 26.
    B-Tree • • • • Много ключей вузле (обобщение 2-3-4 дерева) Небольшая высота O(logt n+1) Узел кратен странице файловой системы Поиск значения или диапазона (невозможно в хеш-таблице) • Ключи отсортированы
  • 27.
    Обзор Batched problems Online problems •сортировка в • дерево в памяти памяти ▫ std::map, std::set ▫ qsort, std::sort • хеш-таблица • внешняя сортировка ▫ std::unordered_ma ▫ sort p/set • Berkeley DB (диск) • Berkeley DB (память)
  • 28.
    Что дальше? • Задачане помещается на один сервер ▫ большой объем данных (BigData!) ▫ ограничение CPU (одного ядра) ▫ отказ оборудования • Разбиваем на независимые подзадачи ▫ Параллельные вычисления ▫ Race conditions ▫ Необходимость синхронизации  mutex’ы  семафоры  условные переменные
  • 29.
    Race conditions (гонки) account= 100 Thread 1 … account += 50 Результат: account = 100; 50; 150 Thread 2 … account -= 50
  • 30.
    Функциональное программирование • Неменяем данные, а создаем новые • Все вычисления – функции, зависят только от аргументов • Такие программы проще распараллелить • Языки: Lisp, Haskell, Erlang, …
  • 31.
  • 32.
    Идея MapReduce • Пары(ключ; значение) • Программа описывается путем определения функций ▫ map: (in_key; in_value) -> [(out_key; intermediate_value)] ▫ reduce: (out_key; [intermediate_value]) -> out_value • После map происходит группировка и сортировка по ключу out_key • Каждая reduce-задача работает со своим множеством out_key
  • 33.
  • 34.
    Основные принципы • Параллелизм ▫map работает параллельно ▫ reduce – параллельно для разных out_key • Узкое место – reduce только после map • Локальность – обрабатываем там, где данные • Отказоустойчивость ▫ перезапуск map неудачных или долгих задач ▫ перезапуск выполняющихся reduce • Оптимизация ▫ зависшие map запускаем на свободных машинах ▫ combiner – reduce функция, которая работает на map стадии (если ассоциативна и коммутативна)
  • 35.
    Задача 1 Выбрать (посчитать)карты c уникальными именами • Ключ – имя карты; значение пусто • Mapper – тождественный • Reducer ▫ 1 reducer – uniq ▫ 1 reducer + 1 combiner – uniq ▫ N reducers + counters  на выходе – N файлов с именами
  • 36.
    Задача 2 Посчитать суммуочков карт черной масти (T – 11, К – 4, Д – 3, В – 2, 10 – 10, ост. – 0) • Ключ: имя + масть • Mapper: карта -> очки (для красных – 0) • Reducer: суммирование • Combiner = reducer или • Только mapper, результат – в счетчике
  • 37.
    Задача 3 Посчитать среднеечисло очков в каждой масти (T – 11, К – 4, Д – 3, В – 2, 10 – 10, ост. – 0) • Ключ: имя + масть • Mapper: тождественный • Combiner: нет • Partitioner: по мастям • Reducer: AVG
  • 38.
    Недостатки MapReduce • Толькопакетная обработка (batched problems) • Большое время отклика (латентность) • Универсальный инструмент, не оптимален • В реальных задачах требуется несколько map/reduce этапов
  • 39.
  • 40.
    HDFS (Hadoop Distributed FileSystem) • Иерархическая структура, управляется namenode • Файлы разбиваются на блоки (64 Mb) • Файлы хранятся на узлах datanodes (3 реплики) • Поиск “ближайшей” реплики с помощью namenode • Получение данных напрямую с datanode
  • 41.
  • 42.
    Программирование для Hadoop •Hadoop Java API ▫ реализовать классы Mapper, Reducer • Streaming ▫ streaming.jar; взаимодействие через stdin/stdout • Pipes ▫ C++, сокеты • Запуск: $> /usr/local/bin/hadoop jar UniqUsers.jar /logs /result ▫ Streaming $> hadoop jar /usr/local/hadoop/contrib /streaming/hadoop-streaming*.jar –input /logs/ – output /result –mapper cat –reducer “wc –l”
  • 43.
    Надо быстро, ноне точно • Оценить параметра • Получить качественные характеристики (распределение по пользователей по географии, по полу, …) • Проверить гипотезу • Отладить алгоритм, запрос к данным • Сэкономить время Как избежать больших данных?
  • 44.
    Фильтр Блума (Bloomfilter) • Бертон Блум, 1970 • Быстрая проверка, что элемента во множестве точно нет • Реализация: ▫ битовый массив длины m, k независимых хеш-функций ▫ каждый ключ – k единиц в массиве ▫ Проверка положительна, если везде единицы • Операции над множествами – операции над битовыми массивами • Вероятность ложного срабатывания: (1 – e-kn/m)k
  • 45.
    Сэмплирование • Sampling илиВыборочные исследования • Раздел математической статистики • Анализируем выборку из генеральной совокупности • Выборка: hash(userId) % N = k (например) female, % male, % 1/32 45,10 54,90 1/8 45,54 54,46 ¼ 45,90 54,10 full 45,29 54,71 • Ошибка – доверительный интервал с заданным уровнем доверия (95%, 99%) • см. Кокрен У. «Методы выборочного исследования»
  • 46.
    Обзор Пакетная обработка: точно икачественно • сортировка в памяти ▫ qsort, std::sort • внешняя сортировка ▫ sort • Berkeley DB (диск) • MapReduce Быстро, но приблизительно • Фильтр Блума • Сэмплирование Online обработка: быстро и точно • дерево в памяти ▫ std::map, std::set • хеш-таблица ▫ std::unordered_map/set • Berkeley DB (память)
  • 47.