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

Hadoop implementation in Wikimart

Jan 18, 2015

Download

Documents

Roman Zykov

 
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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