hadoop implementation in wikimart
DESCRIPTION
TRANSCRIPT
Hadoopпрактика внедрения
Roman Zykov, Head of analytics at Wikimart.ru24.02.2012
Содержание
• Общие принципы• Система управления кластером• Языки программирования
Зачем?
Hadoop - простая среда параллельной обработки и хранения данных.
Преимущества:•Скорость работы с большими данными•Удобство работы с данными•Высокая отказоустойчивость кластера
Минусы:•Система нереального времени•Долго «заводится»•Не отлажена до конца система бекапирования NameNode
MapReduce
{KEY, VALUE} – входная таблицаMAP – Операции над строками, считая их независимыми (VALUE)REDUCE – Операция GROUP BY над ключем (KEY)
SELECT WORDS(TEXT1), COUNT(*) FROM TABLE1GROUP BY WORDS(TEXT1)
MapReduce
Job Execution
HDFS
HDFS Write
HDFS Storage
Compression
Algorithm Compression Ratio IO performance increaseSnappy 40% 25%LZF 40% 21%LZO 41% 5%ZLIB 48% -16%
Использование кодеков сжатия может существенно поднять производительность.
На каких этапах могут использоваться кодеки:•Хранение в HDFS (ускоряет операцию MAP)•Сжатие выхода MAP (ускоряет SHUFFLE и REDUCE)•Сжатие tmp файлов
Cloudera SCM - Hardware
Cloudera SCM - Services
Cloudera SCM - HUE
• Beesfax for HIVE• HDFS File Browser• Job designer• Job browser• PIG Shell• User admin
Cloudera SCM - HDFS
Cloudera SCM – Job Tracker
Cloudera SCM – Job Tracker
Restore
• Безболезненная потеря нескольких DataNodes. Коэффициент репликации по умолчанию равен 3.
• Отсутствует нормальный механизм восстановления NameNode.Только через NFS диск.
Programming
Родной язык – Java
•Hive - SQL подобный от Facebook•PIG - скриптовый от Yahoo•JQL - IBM•Cascalog (Clojure) - Twitter•JavaScript - Microsoft
Можно писать и на других: Python, C и т.д.
HIVE
• Генерирует jar файлы для каждого map-reduce• Обмен данными tmp файлами в HDFS• Почти SQL• Хранит данные в виде csv или sequence файлов в HDFS• Партиции• Индексы• Любые JOINs, большую таблицу лучше ставить справа• CREATE TABLE, CREATE TABLE EXTERNAL,DROP TABLE • CREATE DATABASE• VIEWS• Нет: Delete, Update• REGEXP по названию полей• Поддерживает сложные структуры данных• Поддерживает внешние функции (Java, Python и т.д.)
HIVE - Example
SELECT hs2.search_word, hs2.model_id, hs2.weight, hs2.visitorsFROM
(select hs1.search_word, hs1.model_id, rank(hs1.search_word) as rank ,hs1.weight, hs1.visitorsFROM
(SELECT 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(floor((CASE page_typeWHEN 'cart_add' THEN 3WHEN 'order' THEN 5ELSE 1 END)
*EXP((-0.01)*((unix_timestamp()-date_time)/86400))*100)) AS weight
from hadoop_catalog_model hc JOINhadoop_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 LIMIT 1000000) 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) hs1
DISTRIBUTE BY hs1.search_wordSORT BY hs1.search_word, hs1.weight desc) hs2
WHERE hs2.rank < 6
PIG
• Генерирует jar файлы для каждого map-reduce• Обмен данными tmp файлами в HDFS• Скриптовый DataFlow• Хранит данные в виде csv или sequence файлов, ? AVRO • Поддерживает внешние функции (Java, Python и т.д.)• Поддерживает Custom Loaders• Поддерживает сложные структуры данных
PIG - Example
%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;--Copy L for joinL2 = FOREACH L GENERATE item_id, weight;
-- calculate cosine valueCOS_1 = JOIN G BY item_id1, L BY item_id;COS_2 = JOIN COS_1 BY item_id2, L2 BY item_id;COS_3 = FOREACH COS_2 GENERATE $0 as item_id1, $1 as item_id2, (float)$2/(float)$5/(float)$7 as weight, $3 as qty;
--fs -rmr /data/itemview_len;STORE COS_3 INTO '/tmp/itemview_matrix' USING PigStorage();
Cascalog
Раньше он писал на PIG и UDF на Java
…. Потом ему …. Надоело
И он сделал новый язык Cascalog для Clojure
user=> (?<- (stdout) [?person] (age ?person 25))
user=> (?<- (stdout) [?person1 ?person2 ?delta] (age ?person1 ?age1) (follows ?person1 ?person2)(age ?person2 ?age2) (- ?age2 ?age1 :> ?delta)(< ?delta 0))
Cascalog - Example
(ns cascalog-demo.demo (:use cascalog.api) (:require [cascalog [vars :as v] [ops :as c]]) (:gen-class))
(defn textline-parsed [dir num-fields] (let [outargs (v/gen-nullable-vars num-fields) source (hfs-textline dir)] (<- outargs (source ?line) (c/re-parse [#"[^\s]+"] ?line :>> outargs) (:distinct false))))
(defn compute-news-feed [output-tap follows-dir action-dir] (let [follows (follows-data follows-dir) action (action-data action-dir) follower-count (<- [?person ?count] (follows ?person2 ?person) (c/count ?count))] (?<- output-tap [?person ?feed] (follows ?person ?person2) (action ?person2 ?action ?time) (follower-count ?person2 ?followers) (action-score (System/currentTimeMillis) ?followers ?time :> ?score) (:sort ?score) (:reverse true) (mk-feed ?person2 ?action ?time :> ?feed))))
(defn -main [follows-dir action-dir output-dir] (compute-news-feed (hfs-textline output-dir) follows-dir action-dir))
Cascalog - Example
(ns cascalog-demo.demo (:use cascalog.api) (:require [cascalog [vars :as v] [ops :as c]]) (:gen-class))
(defn textline-parsed [dir num-fields] (let [outargs (v/gen-nullable-vars num-fields) source (hfs-textline dir)] (<- outargs (source ?line) (c/re-parse [#"[^\s]+"] ?line :>> outargs) (:distinct false))))
(defn compute-news-feed [output-tap follows-dir action-dir] (let [follows (follows-data follows-dir) action (action-data action-dir) follower-count (<- [?person ?count] (follows ?person2 ?person) (c/count ?count))] (?<- output-tap [?person ?feed] (follows ?person ?person2) (action ?person2 ?action ?time) (follower-count ?person2 ?followers) (action-score (System/currentTimeMillis) ?followers ?time :> ?score) (:sort ?score) (:reverse true) (mk-feed ?person2 ?action ?time :> ?feed))))
(defn -main [follows-dir action-dir output-dir] (compute-news-feed (hfs-textline output-dir) follows-dir action-dir))
SQOOP
SQOOP утилита обмена данными между HDFS и базами данных
Настройка подключения:--connect jdbc:sqlserver://dwh.lan;user=*****;password=*******;database=Web;
Экспорт данных: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"
Wikimart system: Data flow
BigDataUniversity.com
Thank you