47
Big Data: первые шаги Антон Горохов 2013

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

Embed Size (px)

DESCRIPTION

 

Citation preview

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

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

Антон Горохов2013

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

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

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

etc.

Откуда данные?

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

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

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

Интернет

поиск

колаборативная

фильтрацияанализ

настроений

контекстная

реклама

статистика

аналитика

персонализация

социальный

поискмаркетинговы

еисследования

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

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

…)▫ сколько страниц посмотрели

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

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

• Технические характеристики (для дизайна и юзабилити)

• Интересы посетителей▫ общая аудитория с другими сайтами

• Мониторинг сайта

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

Требования к статистике•Полнота▫Что считать

См. предыдущий слайд•Скорость▫Realtime (оперативно)▫Offline (задержка в насколько часов, день)

•Точность▫Максимально точно▫Приближенно

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

Пример: посещаемость по часам

Что это за сайты: знакомства, новости, почта?

Новости

Почта Знакомства

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

Исходные данные – логи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

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

Задача: сколько уникальных?0000002A4F776242285A553B01E8FC01000000014ED4E0AD34C5064F00E749010000001D4E779AAA4CCC66FC01D276010000002A4F776242285A553B01E8FF010000002A4F776242285A553B01E8FD01000000014F5A413832E111430401FA010000002A4F70C38B0B8F3B230084270105FE817949848B9300011D02F8CDF0010000002A4F44135A990142CF007FE70106199C9C4F043E2D000032F181E57A01000000014D605672AED8116B0385750100000BB94EDBCD4241CD2D1A0889D8010000002A4F7762432A2555410201D3010000002A4F7762432AB6553E01F6A1010000002A4F77624310AD553802030601000000014F75575E27308DC005855E0105F656904F0578B60000080AD99ADC010000002A4F7762431890553701F956010000002A4F776243285A553B01E9010105F9DAFE4ED2238B000179629AA20C01060C116D4F6F995700002468D58B90010000002A4F77624316AB553F01F32501000000014F0165D51EFB23200F37CA01000000014F7761DABC730A5508D2A901000000014F4E1AF776B57E5901B3E1010000002A4F7762432C85554301FC8D01

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

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>());

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

Быстрая сортировка (quicksort)• Алгоритм:▫выбрать опорный

элемент▫partition

(перестановка элементов)▫то же самое для обеих частей

• Время работы: O(n log n) – средний случайO(n2) – худший случай

• Модификации алгоритма:▫учет специфики данных▫рандомизация▫хвостовая рекурсия (Т.Кормен “Алгоритмы: построение и

анализ”)▫композиция алгоритмов

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

Реализации сортировки• qsort() ▫опорный элемент – медиана из 3х (средний из

первого, центрального и последнего)▫partition – O(n); больший интервал – в стек,

второй – в процедуру partition▫интервалы длины ≤ M не сортируем вообще▫в конце – сортировка вставками всего

массива(Knuth's Algorithm Q)

• std::sort() – алгоритм Introsort▫quicksort▫heapsort на большой глубине рекурсии (>

2log n)▫сортировка вставками коротких массивов –

O(n2) быстрее при малых n попадает в кеш процессора

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

Практические советы•Полезно знать чем пользуешься▫приемы и хороший стиль▫подходы к разработке алгоритма▫http://www.pnambic.com/CPS/SortAnal/ -

разбор sort.c•Используйте стандартные решения▫велосипед уже изобретен▫проверен миллионами▫известно как работает и предсказуем

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

Область использования•Сортированные массивы – для неизменяющихся данных (batched problems)

•Быстрый поиск•Медленная вставка

Что делать, если данные меняются?

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

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.)

•Реализация – красно-черное дерево

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

Деревья•Бинарное дерево поиска

< - налево> - направо => сортировка, уникальность

•Высота от log n до n•Необходимо балансировать

AVL-дерево: |hR – hL| ≤ 1•Высота log n•Поиск/вставка/удаление O(log n)

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

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

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

Красно-черное дерево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

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

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;

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

Хеш-таблица• Выбор 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, перестроения▫ задается типом или объектом (Э.Гамма “Приемы объектно-

ориентированного проектирования”, А.Александреску “Современное проектирование на С++”)

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

Область использования•RB-деревья и хеш-таблицы (Map/set, unordered_map/set) – структуры данных в памяти

•Подходят для изменяющихся данных (online problems)

Что делать, если памяти не хватает?

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

Утилита sort• $> cat users.txt | sort –o sorted.txt users.txt

sort3GlEkK

sort91PmLZ

sortKZkFrx……………..

…..

sort3GlEkK

sorted.txt

16

……………………….

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

Внешняя сортировка•Ограничение – только место на диске

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

дерево или пирамида для выбора наименьшего прочие вариации: Д.Кнут, т.3

Что делать, если данных много и они меняются?

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

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•Много где используется

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

B-Tree

•Много ключей в узле (обобщение 2-3-4 дерева)

•Небольшая высота O(logt n+1)•Узел кратен странице файловой системы•Поиск значения или диапазона (невозможно

в хеш-таблице)•Ключи отсортированы

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

ОбзорBatched problems

•сортировка в памяти▫qsort, std::sort

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

•Berkeley DB (диск)

Online problems•дерево в памяти▫std::map, std::set

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

•Berkeley DB (память)

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

Что дальше?•Задача не помещается на один сервер▫большой объем данных (BigData!)▫ограничение CPU (одного ядра)▫отказ оборудования

•Разбиваем на независимые подзадачи▫Параллельные вычисления▫Race conditions▫Необходимость синхронизации

mutex’ы семафоры условные переменные

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

Race conditions (гонки)account = 100

Thread 1…account += 50

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

Thread 2…account -= 50

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

Функциональное программирование•Не меняем данные, а создаем новые

•Все вычисления – функции, зависят только от аргументов

•Такие программы проще распараллелить

•Языки: Lisp, Haskell, Erlang, …

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

Google, 2004

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

Идея MapReduce•Пары (ключ; значение)•Программа описывается путем

определения функций▫map: (in_key; in_value) -> [(out_key;

intermediate_value)]▫ reduce: (out_key; [intermediate_value]) ->

out_value•После map происходит группировка и

сортировка по ключу out_key•Каждая reduce-задача работает со

своим множеством out_key

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

Схема вычислений

группировка и сортировка по ключу

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

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

•Узкое место – reduce только после map•Локальность – обрабатываем там, где

данные •Отказоустойчивость▫перезапуск map неудачных или долгих

задач▫перезапуск выполняющихся reduce

•Оптимизация ▫зависшие map запускаем на свободных

машинах▫combiner – reduce функция, которая

работает на map стадии (если ассоциативна и коммутативна)

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

Задача 1Выбрать (посчитать) карты c уникальными именами

•Ключ – имя карты; значение пусто•Mapper – тождественный•Reducer▫1 reducer – uniq▫1 reducer + 1 combiner – uniq▫N reducers + counters

на выходе – N файлов с именами

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

Задача 2Посчитать сумму очков карт черной масти (T – 11, К – 4, Д – 3, В – 2, 10 – 10, ост. – 0)

•Ключ: имя + масть•Mapper: карта -> очки (для красных – 0)

•Reducer: суммирование•Combiner = reducerили•Только mapper, результат – в счетчике

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

Задача 3Посчитать среднее число очков в каждой масти (T – 11, К – 4, Д – 3, В – 2, 10 – 10, ост. – 0)

•Ключ: имя + масть•Mapper: тождественный•Combiner: нет•Partitioner: по мастям•Reducer: AVG

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

Недостатки MapReduce•Только пакетная обработка (batched problems)

•Большое время отклика (латентность)

•Универсальный инструмент, не оптимален

•В реальных задачах требуется несколько map/reduce этапов

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

Кластер Hadoop

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

HDFS(Hadoop Distributed File System)•Иерархическая структура, управляется namenode

•Файлы разбиваются на блоки (64 Mb)

•Файлы хранятся на узлах datanodes (3 реплики)

•Поиск “ближайшей” реплики с помощью namenode

•Получение данных напрямую с datanode

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

Схема вычислений в Hadoop

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

Программирование для 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”

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

Надо быстро, но не точно•Оценить параметра•Получить качественные характеристики (распределение по пользователей по географии, по полу, …)

•Проверить гипотезу•Отладить алгоритм, запрос к данным•Сэкономить время

Как избежать больших данных?

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

Фильтр Блума (Bloom filter)• Бертон Блум, 1970• Быстрая проверка, что элемента во множестве точно

нет• Реализация:▫битовый массив длины m, k независимых хеш-функций▫каждый ключ – k

единиц в массиве

▫Проверка положительна, если везде единицы

• Операции над множествами – операции над битовыми массивами

• Вероятность ложного срабатывания: (1 – e-kn/m)k

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

Сэмплирование•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

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

ОбзорПакетная обработка: точно и качественно

Online обработка: быстро и точно

• сортировка в памяти▫ qsort, std::sort

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

• Berkeley DB (диск)• MapReduce

• дерево в памяти▫ std::map, std::set

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

• Berkeley DB (память)

Быстро, но приблизительно• Фильтр Блума• Сэмплирование

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

СпасибоАнтон Горохов[email protected]