Сервис рекомендаций на виртуальном Hadoop кластере
Роман Зыков
Содержание
• Проблема: сервисы рекомендаций• Архитектуры• Компоненты Hadoop• Конфигурация Hadoop• Интеграция с БД• Hive и Pig• Что дальше
Рекомендации
Проблема
Алгоритмы рекомендаций это:• перемножение больших матриц• очень большие JOIN
Пример:Лог из 338Мб –> 55 Гб –> 32 Мб
Архитектура До
Хранилище MS SQL Enterprise (2 CPU Xeon, 48G RAM, 8x300Gb RAID10 SAS)
Эксплуатация:– обновление раз в неделю– 5 часов в лучшем случае– 30% вероятности падения из-за tempdb– блокировал ETL
Архитектура После
• виртуальный кластер: 6 нод• 2Gb RAM, 30 Gb HDD, 16 cores• Cloudera Manager (free up to 50)
Компоненты Hadoop
Конфигурация Hadoop
• Компрессия данных (Snappy или LZO)• Предварительная фильтрация данных• Бекапирование namenode на NFS• 1 map/reduce задача на ноду• Настройка памяти Java
КомпрессияAlgorithm Compression Ratio IO performance increaseSnappy 40% 25%LZF 40% 21%LZO 41% 5%ZLIB 48% -16%
Snappy – Sequence Files, Avro, HBASE, txtLZO – поддерживает индексацию для split операции
• HDFS хранение• MAP output• MapReduce output• AVRO!
SQOOPSQOOP утилита обмена данными между Hadoop (HDFS, HIVE, HBASE) и базами данных.
sqoop export --options-file ./sqoop_recommendations_connect --table ItemView --export-dir /data/itemview --input-fields-terminated-by '\t'
sqoop import --options-file ./sqoop_web_connect --table hadoop_webstat_daily -m 1 --warehouse-dir /data --fields-terminated-by '\t'
sqoop eval --options-file ./sqoop_warehouse_connect --query "exec dbo._hadoop_model_value"
PIG• Скриптовый DataFlow • Удобен для ETL!• Данные в виде csv или sequence файлов, AVRO • UDF (Java, Python и т.д.)• Поддерживает Custom Loaders• Поддерживает сложные структуры данных• JOINS/ORDER BY• Pig 0.10.0 добавлены DataFu UDF от LinkedIn
PIG%declare cur_date `date +%s`;set mapred.output.compress true;set mapred.output.compression.codec 'org.apache.hadoop.io.compress.SnappyCodec';set mapred.output.compression.type 'BLOCK';set mapred.compress.map.output true;set mapred.map.output.compression.codec 'org.apache.hadoop.io.compress.SnappyCodec';
-- load dataA = load '/tmp/itemview_input' AS (session_id1:int, item_id1:int, val1:int);B = load '/tmp/itemview_input' AS (session_id2:int, item_id2:int, val2:int);
-- calculate the length of one item vectorL_0 = load '/tmp/itemview_input' AS (session_id:int, item_id:int, val:int);L_1 = FOREACH L_0 GENERATE item_id, val*val as val;L_2 = GROUP L_1 BY item_id;L = FOREACH L_2 GENERATE FLATTEN(group) as item_id, (long)SQRT(SUM(L_1.val)) as weight;
STORE L INTO '/tmp/itemview_matrix' USING PigStorage();
Hive•Виртуальное ХД, Почти SQL, ODBC/JDBC•Сsv, Sequence, AVRO в HDFS•HBASE•Партиции•Индексы•JOINS•Таблицы, Views•Нет: Delete, Update !!!•REGEXP по названию полей•Cложные структуры данных: map, arrays, struct•Поддерживает UDF и UDTF функции (Java, Python и т.д.)
HiveSELECT hs.search_word, b.model_id, SUM(b.weight) as weight, count(distinct hs.visitor_id) as visitors
FROM (SELECT hw.visitor_id, hw.date_time, hw.model_id, SUM(CASE page_type WHEN 'cart_add' THEN 3
WHEN 'order' THEN 5 ELSE 1) FROM hadoop_catalog_model hc JOIN
hadoop_webstat hw ON (hc.model_id=hw.model_id)
WHERE hc.t_recommended_good_id > 0 GROUP BY hw.visitor_id, hw.date_time, hw.model_id) b
JOIN hadoop_searchwords hsON b.visitor_id = hs.visitor_id AND ROUND(hs.date_time/86400)*86400 = b.date_time WHERE ! (hs.search_word RLIKE '^[-+]?[0-9]*\.?[0-9]+$') and length(hs.search_word) > 2GROUP BY hs.search_word, b.model_idHAVING count(distinct hs.visitor_id) >1LIMIT 100
Что дальше
• Realtime веб-аналитика на HBASE + HIVE• Хранилище данных на HIVE• AVRO• OLAP?
Вопросы[email protected]
Top Related