Post on 11-Nov-2014
description
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
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 (Windows NT 5.1; U; Edition Yx; ru) Presto/2.10.229 Version/11.61" "ruid=000000014F5A413832E111430401FA01" "-" 1333224002.895
IP время URL referer браузер (User-Agent)
cookie
Задача: сколько уникальных?0000002A4F776242285A553B01E8FC01000000014ED4E0AD34C5064F00E749010000001D4E779AAA4CCC66FC01D276010000002A4F776242285A553B01E8FF010000002A4F776242285A553B01E8FD01000000014F5A413832E111430401FA010000002A4F70C38B0B8F3B230084270105FE817949848B9300011D02F8CDF0010000002A4F44135A990142CF007FE70106199C9C4F043E2D000032F181E57A01000000014D605672AED8116B0385750100000BB94EDBCD4241CD2D1A0889D8010000002A4F7762432A2555410201D3010000002A4F7762432AB6553E01F6A1010000002A4F77624310AD553802030601000000014F75575E27308DC005855E0105F656904F0578B60000080AD99ADC010000002A4F7762431890553701F956010000002A4F776243285A553B01E9010105F9DAFE4ED2238B000179629AA20C01060C116D4F6F995700002468D58B90010000002A4F77624316AB553F01F32501000000014F0165D51EFB23200F37CA01000000014F7761DABC730A5508D2A901000000014F4E1AF776B57E5901B3E1010000002A4F7762432C85554301FC8D01
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мя связями• Сбалансированность: все пустые
поддеревья – на одном уровне
• Поиск – log N+1 узлов• Вставка – макс. log N+1
разделений узлов (в среднем < 1)
• Минусы: накладные расходы при работе с узлами• см. Седжвик Р. «Алгоритмы на C++»
I
C
E,H,G
N,R
A L,M P S,X
Красно-черное деревоI
C
E,G,H
N,R
A L,M P S,X
I
C
A
P
R
N
M
S
L
X
G
E H
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_mapstd::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
sortKZkFrx……………..
…..
sort3GlEkK
sorted.txt
16
……………………….
Внешняя сортировка•Ограничение – только место на диске
(х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
•сортировка в памяти▫qsort, std::sort
•внешняя сортировка▫sort
•Berkeley DB (диск)
Online problems•дерево в памяти▫std::map, std::set
•хеш-таблица▫std::unordered_map/set
•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 (например)
•Ошибка – доверительный интервал с заданным уровнем доверия (95%, 99%)
•см. Кокрен У. «Методы выборочного исследования»
1/32 1/8 ¼ fullfemale, % 45,10 45,54 45,90 45,29male, % 54,90 54,46 54,10 54,71
ОбзорПакетная обработка: точно и качественно
Online обработка: быстро и точно
• сортировка в памяти▫ qsort, std::sort
• внешняя сортировка▫ sort
• Berkeley DB (диск)• MapReduce
• дерево в памяти▫ std::map, std::set
• хеш-таблица▫ std::unordered_map/set
• Berkeley DB (память)
Быстро, но приблизительно• Фильтр Блума• Сэмплирование
СпасибоАнтон Гороховanton@rambler-co.ru