Алексей ВоропаевРуководитель группы ранжирования результатов поиска
Hadoop Streaming: простой путь к масштабированию приложений обработки данных
www.mail.ru 2
Зачем?Данные постоянно растут:
- Граф внешних ссылок 2007 год: 100 Гб- Граф внешних ссылок 2011 год: 10 Тб- Граф всех ссылок 2011 год: 100 Тб- Поведенческая статистика: 300 Гб / день
www.mail.ru 3
Как обработать «большие» данные?- Нельзя хранить на 1-ой машине- Нельзя обработать на 1-ой машине
www.mail.ru 4
Горизонтальное масштабирование1. Как разбить данные?2. Как организовать вычисления?
Больше железа — больше поломок!1. Сохранность данных?2. Отказоустойчивость вычислений?3. Балансировка?4. Дальнейшее масштабирование?
www.mail.ru 5
Частичные решения:1. Распределённые FS2. Распределённые СУБД3. MPI, PVM, Cluster OpenMP и т.д.
www.mail.ru 6
Где взять людей???
- опыт работы с петабайтами данных- знания распределённых вычислений- умение делать быстро и надёжно
Комплексные решения?Google:
- 2003 год: GoogleFileSystem- 2004 год: MapReduce
www.mail.ru 7
Подсчет уникальных строк:
# cat input | sort | uniq -c > output
www.mail.ru 8
cat
cat
cat
sort
sort uniq -c
Строки независимы
Группируем в кучи по ключу
Обрабатываем кучи
параллельно
uniq -c
input
ou
tput
www.mail.ru 9
Добавляем параллелизм:
cat
cat
cat
sort
sort uniq -c
uniq -c
input
ou
tput
map shufle reduce
MapReduce:
Применении:- Распределённый sort, grep и т.д.- Статистика
- SQL-подобные операции- Алгоритмы на графах- Обработка текстов (обратный индекс)- Машинное обучение- и т.д
www.mail.ru 11
Экосистема для «больших» данных:- Линейно масштабируемые- Для «обычного» железа- Простота использования- Основан на Java
www.mail.ru 12
Распределённая файловая система:- Блочная структура- Адаптация под очень большие файлы- Репликации- Автоматическое восстановление- Дружественна MapReduce
www.mail.ru 13
Фреймворк для вычислений:- Инфраструктура- Планирование и балансировка нагрузки- Мониторинг- Основан на Java
www.mail.ru 14
Streaming:
hadoop jar hadoop-streaming.jar \-input /data/input_dir \-output /data/output_dir \-mapper cat \-reducer 'uniq -c'
Mapper & Reducer:- На любом языке: Python, Ruby, C++, bash- Взаимодействие через стандартные потоки- Быстро и просто
www.mail.ru 15
Только map:
hadoop jar hadoop-streaming.jar \-D mapred.output.compress=true \-D mapred.output.compression.codec=GzipCode \-D mapreduce.job.reduces=0 \-input /data/input_dir \-output /data/output_dir \-mapper cat
www.mail.ru 16
Запуск скриптов:hadoop jar hadoop-streaming.jar \
-D mapreduce.job.reduces=100 \-files ./bin/mapper.pl \-input /data/input_dir \-output /data/output_dir \-mapper mapper.pl \-reducer 'uniq -c'
mapper.pl:- input: строчки лога- output: '<page>\n'
www.mail.ru 17
Комбайнер:
mapper.pl:- input: строчки лога- output: '<uid>\t1'
reducer.pl:- input: '<uid1>\t<cnt1>'
'<uid1>\t<cnt2>'- output: '<uid1>\t<cnt1+cnt2>'
hadoop jar hadoop-streaming.jar \-D mapreduce.job.reduces=100 \-files ./bin/mapper.pl,./bin/reducer.pl \-input /data/input_dir \-output /data/output_dir \-mapper mapper.pl \-combiner reducer.pl \-reducer reducer.pl
www.mail.ru 18
Несколько входов:1. Данные хранятся в одном формате2. Несколько '-input'3. Переменная окружения $map_input_file
Любое свойство конфига доступно через переменную окружения.
www.mail.ru 19
Обмен данными:
или
[identifier]:- text : текстовые строки- raw: 4 байта длины + бинарные данные- typedbytes: код типа + бинарные данные
-D stream.map.input=[identifier] -D stream.map.output=[identifier] -D stream.reduce.input=[identifier] -D stream.reduce.output=[identifier]
-io [identifier]
www.mail.ru 20
Hbase:- нереляционное хранилище колонок данных- аналог BigTable- http://github.com/wanpark/hadoop-hbase-streaming
# hadoop jar hadoop-streaming.jar \ -input dammy_input \ -output output \ -mapper /bin/cat \ -inputformat \
org.childtv.hadoop.hbase.mapred.JSONTableInputFormat \ -jobconf map.input.table=scores \ -jobconf map.input.columns=course:
# hadoop dfs -cat output/*Dan {"course:math":"87","course:art":"97"}Dana {"course:math":"100","course:art":"80"}www.mail.ru 21
http://d.hatena.ne.jp/wanpark/20081113/1226555456
Счетчики и job-статус:
- позволяют вести учет событий- используют стандартный поток ошибок- счетчик:
reporter:counter:<group>,<counter>,<amount>- статус: reporter:status:<message>
www.mail.ru 22
Отладка, тесты:
- читаемый ввод-вывод- наличие системы мониторинга- логирование- легко запускать без Hadoop
cat input | sort | uniq -c > output
www.mail.ru 23
Плюсы:- простота разработки- удобство отладки- любые языки
Минусы:- не все возможности Hadoop- замедление примерно 15%- сложности с бинарными данными
www.mail.ru 24
Алексей ВоропаевРуководитель группы ранжирования результатов поиска
www.mail.ru
Спасибо!