3. Зачем?
Hadoop - простая среда параллельной обработки и хранения
данных.
Преимущества:
•Скорость работы с большими данными
•Удобство работы с данными
•Высокая отказоустойчивость кластера
Минусы:
•Система нереального времени
•Долго «заводится»
•Не отлажена до конца система бекапирования NameNode
4. MapReduce
{KEY, VALUE} – входная таблица
MAP – Операции над строками, считая их независимыми (VALUE)
REDUCE – Операция GROUP BY над ключем (KEY)
SELECT WORDS(TEXT1), COUNT(*)
FROM TABLE1
GROUP BY WORDS(TEXT1)
10. Compression
Algorithm Compression Ratio IO performance increase
Snappy 40% 25%
LZF 40% 21%
LZO 41% 5%
ZLIB 48% -16%
Использование кодеков сжатия может существенно поднять
производительность.
На каких этапах могут использоваться кодеки:
•Хранение в HDFS (ускоряет операцию MAP)
•Сжатие выхода MAP (ускоряет SHUFFLE и REDUCE)
•Сжатие tmp файлов
17. Restore
• Безболезненная потеря нескольких DataNodes. Коэффициент
репликации по умолчанию равен 3.
• Отсутствует нормальный механизм восстановления NameNode.
Только через NFS диск.
18. Programming
Родной язык – Java
•Hive - SQL подобный от Facebook
•PIG - скриптовый от Yahoo
•JQL - IBM
•Cascalog (Clojure) - Twitter
•JavaScript - Microsoft
Можно писать и на других: Python, C и т.д.
19. 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 и т.д.)
20. HIVE - Example
SELECT hs2.search_word, hs2.model_id, hs2.weight, hs2.visitors
FROM
(select hs1.search_word, hs1.model_id, rank(hs1.search_word) as rank ,hs1.weight, hs1.visitors
FROM
(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_type
WHEN 'cart_add' THEN 3
WHEN 'order' THEN 5
ELSE 1 END)
*EXP((-0.01)*((unix_timestamp()-
date_time)/86400))*100)) AS weight
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
LIMIT 1000000
)b
JOIN hadoop_searchwords hs
on 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) > 2
group by hs.search_word, b.model_id
having count(distinct hs.visitor_id) >1
limit 100) hs1
DISTRIBUTE BY hs1.search_word
SORT BY hs1.search_word, hs1.weight desc) hs2
WHERE hs2.rank < 6
21. PIG
• Генерирует jar файлы для каждого map-reduce
• Обмен данными tmp файлами в HDFS
• Скриптовый DataFlow
• Хранит данные в виде csv или sequence файлов, ? AVRO
• Поддерживает внешние функции (Java, Python и т.д.)
• Поддерживает Custom Loaders
• Поддерживает сложные структуры данных
22. 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 data
A = 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 vector
L_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 join
L2 = FOREACH L GENERATE item_id, weight;
-- calculate cosine value
COS_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();
23. 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))