hadoop implementation in wikimart

29
Hadoop практика внедрения Roman Zykov, Head of analytics at Wikimart.ru 24.02.2012

Upload: roman-zykov

Post on 18-Jan-2015

7.646 views

Category:

Documents


6 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Hadoop implementation in Wikimart

Hadoopпрактика внедрения

Roman Zykov, Head of analytics at Wikimart.ru24.02.2012

Page 2: Hadoop implementation in Wikimart

Содержание

• Общие принципы• Система управления кластером• Языки программирования

Page 3: Hadoop implementation in Wikimart

Зачем?

Hadoop - простая среда параллельной обработки и хранения данных.

Преимущества:•Скорость работы с большими данными•Удобство работы с данными•Высокая отказоустойчивость кластера

Минусы:•Система нереального времени•Долго «заводится»•Не отлажена до конца система бекапирования NameNode

Page 4: Hadoop implementation in Wikimart

MapReduce

{KEY, VALUE} – входная таблицаMAP – Операции над строками, считая их независимыми (VALUE)REDUCE – Операция GROUP BY над ключем (KEY)

SELECT WORDS(TEXT1), COUNT(*) FROM TABLE1GROUP BY WORDS(TEXT1)

Page 5: Hadoop implementation in Wikimart

MapReduce

Page 6: Hadoop implementation in Wikimart

Job Execution

Page 7: Hadoop implementation in Wikimart

HDFS

Page 8: Hadoop implementation in Wikimart

HDFS Write

Page 9: Hadoop implementation in Wikimart

HDFS Storage

Page 10: Hadoop implementation in Wikimart

Compression

Algorithm Compression Ratio IO performance increaseSnappy 40% 25%LZF 40% 21%LZO 41% 5%ZLIB 48% -16%

Использование кодеков сжатия может существенно поднять производительность.

На каких этапах могут использоваться кодеки:•Хранение в HDFS (ускоряет операцию MAP)•Сжатие выхода MAP (ускоряет SHUFFLE и REDUCE)•Сжатие tmp файлов

Page 11: Hadoop implementation in Wikimart

Cloudera SCM - Hardware

Page 12: Hadoop implementation in Wikimart

Cloudera SCM - Services

Page 13: Hadoop implementation in Wikimart

Cloudera SCM - HUE

• Beesfax for HIVE• HDFS File Browser• Job designer• Job browser• PIG Shell• User admin

Page 14: Hadoop implementation in Wikimart

Cloudera SCM - HDFS

Page 15: Hadoop implementation in Wikimart

Cloudera SCM – Job Tracker

Page 16: Hadoop implementation in Wikimart

Cloudera SCM – Job Tracker

Page 17: Hadoop implementation in Wikimart

Restore

• Безболезненная потеря нескольких DataNodes. Коэффициент репликации по умолчанию равен 3.

• Отсутствует нормальный механизм восстановления NameNode.Только через NFS диск.

Page 18: Hadoop implementation in Wikimart

Programming

Родной язык – Java

•Hive - SQL подобный от Facebook•PIG - скриптовый от Yahoo•JQL - IBM•Cascalog (Clojure) - Twitter•JavaScript - Microsoft

Можно писать и на других: Python, C и т.д.

Page 19: Hadoop implementation in Wikimart

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 и т.д.)

Page 20: Hadoop implementation in Wikimart

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

Page 21: Hadoop implementation in Wikimart

PIG

• Генерирует jar файлы для каждого map-reduce• Обмен данными tmp файлами в HDFS• Скриптовый DataFlow• Хранит данные в виде csv или sequence файлов, ? AVRO • Поддерживает внешние функции (Java, Python и т.д.)• Поддерживает Custom Loaders• Поддерживает сложные структуры данных

Page 22: Hadoop implementation in Wikimart

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

Page 23: Hadoop implementation in Wikimart

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

Page 24: Hadoop implementation in Wikimart

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

Page 25: Hadoop implementation in Wikimart

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

Page 26: Hadoop implementation in Wikimart

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"

Page 27: Hadoop implementation in Wikimart

Wikimart system: Data flow

Page 28: Hadoop implementation in Wikimart

BigDataUniversity.com

Page 29: Hadoop implementation in Wikimart

Thank you