SlideShare a Scribd company logo
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

More Related Content

PPTX
BigData Week Moscow 2013 - Case: Personalization
PDF
Лекция 4. Стеки и очереди
PDF
ОПК № 5 – Составные типы данных, списки
PDF
Лекция 7. Бинарные кучи. Пирамидальная сортировка
PDF
Алгоритмы и структуры данных весна 2014 лекция 2
PDF
Лекция 1. Анализ эффективности алгоритмов
PDF
Алгоритмы и структуры данных осень 2013 лекция 2
PDF
Векторизация кода (семинар 3)
BigData Week Moscow 2013 - Case: Personalization
Лекция 4. Стеки и очереди
ОПК № 5 – Составные типы данных, списки
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Алгоритмы и структуры данных весна 2014 лекция 2
Лекция 1. Анализ эффективности алгоритмов
Алгоритмы и структуры данных осень 2013 лекция 2
Векторизация кода (семинар 3)

What's hot (20)

PDF
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
PDF
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
PDF
msumobi2. Лекция 1
PPTX
Алгоритмы и структуры данных весна 2014 лекция 1
PDF
Лекция 2. Алгоритмы сортировки
PDF
Лекция 4. Префиксные деревья (tries, prefix trees)
PDF
Лекция 1. Амортизационный анализ (amortized analysis)
PDF
Лекция 7. Стандарт OpenMP (подолжение)
PDF
Лекция о языке программирования Haskell
PDF
Алгоритмы и структуры данных осень 2013 лекция 1
PDF
Лекция 10. Графы. Остовные деревья минимальной стоимости
PDF
Основы С++ (массивы, указатели). Задачи с массивами
PDF
Алгоритмы и структуры данных осень 2013 лекция 4
PDF
Лекция 4: Стек. Очередь
PPT
PDF
Лекция 11. Методы разработки алгоритмов
PDF
Лекция 4: Стеки и очереди
PDF
Алгоритмы и структуры данных осень 2013 лекция 3
PDF
Data Mining - lecture 4 - 2014
PDF
Лекция 3: Бинарный поиск. Связные списки
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
msumobi2. Лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1
Лекция 2. Алгоритмы сортировки
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 7. Стандарт OpenMP (подолжение)
Лекция о языке программирования Haskell
Алгоритмы и структуры данных осень 2013 лекция 1
Лекция 10. Графы. Остовные деревья минимальной стоимости
Основы С++ (массивы, указатели). Задачи с массивами
Алгоритмы и структуры данных осень 2013 лекция 4
Лекция 4: Стек. Очередь
Лекция 11. Методы разработки алгоритмов
Лекция 4: Стеки и очереди
Алгоритмы и структуры данных осень 2013 лекция 3
Data Mining - lecture 4 - 2014
Лекция 3: Бинарный поиск. Связные списки
Ad

Viewers also liked (20)

PDF
Онлайн-классификация пользователей в быстрой Крипте. Родион Желудков
ODP
Apache Hadoop
PPT
ADD2010: Обработка большого объема данных на платформеApache Hadoop
PPTX
Final project
PPTX
SITS14 - A view from the Project Manager by Duncan Watkins
PPT
ingles
PDF
How improving change management can help improve your business duncan watkins
PDF
English Dept Grad Student RESOURCE GUIDE
PPTX
печа куча
PDF
2016SPRING
PPTX
печа куча
PPTX
SITS15 - Next Generation IT Service Skills
PDF
artikel iedereen denkt mee vanuit zijn eigen werkveld
PPTX
Unidad educativa municipal compu
PPTX
Responsive
PPTX
PPTX
Responsive Web Design - Bridging the Gap Between Art Directors
PDF
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
PPT
Celtrixa
PPT
Top big data architecture patterns by Igor Chub
Онлайн-классификация пользователей в быстрой Крипте. Родион Желудков
Apache Hadoop
ADD2010: Обработка большого объема данных на платформеApache Hadoop
Final project
SITS14 - A view from the Project Manager by Duncan Watkins
ingles
How improving change management can help improve your business duncan watkins
English Dept Grad Student RESOURCE GUIDE
печа куча
2016SPRING
печа куча
SITS15 - Next Generation IT Service Skills
artikel iedereen denkt mee vanuit zijn eigen werkveld
Unidad educativa municipal compu
Responsive
Responsive Web Design - Bridging the Gap Between Art Directors
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
Celtrixa
Top big data architecture patterns by Igor Chub
Ad

Similar to Big Data - первые шаги (20)

PPTX
DBD lection 4. Big Data, NoSQL. In Russian.
PPTX
Hadoops MapReduce framework explanations
PDF
ALMADA 2013 (computer science school by Yandex and Microsoft Research)
PPT
PDF
2 я.студент леванов map reduce
PPTX
Мастер класс по алгоритмам. Часть 1
PDF
Cравнительный анализ хранилищ данных (Олег Царев, Кирилл Коринский)
PPTX
Пишем самый быстрый хеш для кэширования данных
PPT
Уровни проектирования информационной системы (обзор материалов портала wiki....
PDF
Yuriy Sherstyuk - Algorithms in Front End: from V8 to VDOM
PDF
Алгоритмы и структуры данных BigData для графов большой размерности
PDF
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
PDF
Purely practical data structures
PDF
Обработка данных в RTB: быстро, дешево и на 98% точно
PDF
AlgoCollections (RUS)
PPT
Лекция 3 Элементарные структуры данных Часть 1
PDF
Data base
 
PDF
20120226 information retrieval raskovalov_lecture03-04
PPTX
Обработка коллекций. Единая суть и множество проявлений
DBD lection 4. Big Data, NoSQL. In Russian.
Hadoops MapReduce framework explanations
ALMADA 2013 (computer science school by Yandex and Microsoft Research)
2 я.студент леванов map reduce
Мастер класс по алгоритмам. Часть 1
Cравнительный анализ хранилищ данных (Олег Царев, Кирилл Коринский)
Пишем самый быстрый хеш для кэширования данных
Уровни проектирования информационной системы (обзор материалов портала wiki....
Yuriy Sherstyuk - Algorithms in Front End: from V8 to VDOM
Алгоритмы и структуры данных BigData для графов большой размерности
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Purely practical data structures
Обработка данных в RTB: быстро, дешево и на 98% точно
AlgoCollections (RUS)
Лекция 3 Элементарные структуры данных Часть 1
Data base
 
20120226 information retrieval raskovalov_lecture03-04
Обработка коллекций. Единая суть и множество проявлений

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

  • 1. Big Data: первые шаги Антон Горохов 2013
  • 2. Повестка дня • Большие Данные – откуда они? • … в интернете. • Область применения: статистика • Классические алгоритмы • MapReduce • Приближенные вычисления
  • 4. Признаки больших данных – 3V • Volume – объем • >> объема 1 HDD • Velocity – скорость • > 10000 событий в секунду • Variability – разнообразие • текст, разные форматы • изображения (графика + EXIF) • видео • звук
  • 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
  • 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, …
  • 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 этапов
  • 40. HDFS (Hadoop Distributed File System) • Иерархическая структура, управляется namenode • Файлы разбиваются на блоки (64 Mb) • Файлы хранятся на узлах datanodes (3 реплики) • Поиск “ближайшей” реплики с помощью namenode • Получение данных напрямую с datanode
  • 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. Фильтр Блума (Bloom filter) • Бертон Блум, 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 (память)