Wprowadzenie do technologii Big Data
Radosław Stankiewicz
HackerBD & DS FTW!Technical Lead Trainer
2
Src: computing.co.uk , https://www.flickr.com/photos/barron/15483113 , tech.co
Agenda
Wstęp -> Map Reduce -> Pig -> Hive -> HBase
4
Wprowadzenie
5
V O LUME6
Variety
7
A|123|10$ B|555|20$ Y|333|15$
{ 'typ'='A', 'id'=123, 'kwota'='10$'
}
Velocity
OLAP
Real Time
Batch
Streaming Interactive analytics
8
Przechowywanie danychpliki (analiza batch i interaktywna) NoSQL (random access) Indeksy
pliki płaskie, csv(rowid,col,czas)->value:Accumulo, HBaseCassandra
MongoDBSolrElastic Search
JSON
AVRO
formaty kolumnowe Bazy grafowe
9
Value
11
Klasyfikacja problemu• Baza danych ulic Warszawy, Dane w formacie JSON,
optymalizacja odbioru śmieci jednego z usługodawców.
• Zdarzenia z bazy transakcyjnej i kart kredytowych w celu lepszego wykrywania fraudów
• System wyszukujący dobre oferty samochodów z wielu serwisów - web crawling, parsowanie danych, analiza trendów cen samochodów
• Centralne repozytorium skanów umów, TB danych, codziennie przybywa kilkaset nowych dokumentów
12
13
BI/BigData/EDH
14
BI BD
EDH
Geneza
• za dużo danych
• pady serwerów
• wolne relacyjne bazy danych
15
16
17
18
Ekosystem Hadoop
19 źródło: Hortonworks
Wprowadzenie do MapReduce na przykładzie
platformy Hadoop
20
Architektura
21
Architektura
22 źródło: Hortonworks
HDFS
Inspirowany GFS(po prawej)
Główne cechy: • Fault tolerant • Commodity, low cost hardware • Batch processing • High throughput, not low latency • Write Once, Read Many
23
HDFS - Namenode, Datanode
24
HDFS - replikacja
Datanodes
Namenode
25
● User Commands o dfs o fsck
● Administration Commands o datanode o dfsadmin o namenode
dfs: appendToFile cat chgrp chmod chown copyFromLocal copyToLocal count cp du dus expunge get getfacl getfattr getmerge ls lsr mkdir moveFromLocal moveToLocal mv put rm rmr setfacl setfattr setrep stat tail test text touchz
hdfs dfs -put localfile1 localfile2 /user/tmp/hadoopdir hdfs dfs -getmerge /user/hadoop/output/ localfile
komendy
26
Uprawnienia
POSIX - Knox - Ranger
27
Architektura YARN
28
Map Reduce Framework
29
Map Reduce Framework
30
M
M
M
M
R
R
R
R
R
Mapper
#!/usr/bin/env python import sys for line in sys.stdin: words = line.strip().split() for word in words: print '%s\t%s' % (word, 1)
line = “Ala ma kota”
Ala 1 ma 1 kota 1
31
Reducer#!/usr/bin/env python import sys current_word = None current_count = 0 word = None for line in sys.stdin: line = line.strip() word, count = line.split('\t', 1) count = int(count) if current_word == word: current_count += count else: if current_word: print '%s,%s' % (current_word, current_count) current_count = count current_word = word if current_word == word: print '%s,%s' % (current_word, current_count)
ala 1 ala 1 bela 1 dela 1
ala,2 bela,1 dela,1
32
Uruchomienie streaming
cat input.txt | ./mapper.py | sort | ./reducer.py
bin/yarn jar [..]/hadoop-*streaming*.jar \ -file mapper.py -mapper ./mapper.py -file reducer.py -reducer ./reducer.py \-input /tmp/wordcount/input -output /tmp/wordcount/output
33
Map Reduce w Java(input) <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> reduce -> <k3, v3> (output) 1) Mapper 2) Reducer 3) run public class WordCount extends Configured implements Tool { public static class TokenizerMapper{...} public static class IntSumReducer{...} public int run(...){...}
}
34
Mapper<KEYIN,VALUEIN,KEYOUT,VALUEOUT>
public static class TokenizerMapper extends Mapper<LongWritable, Text, Text, IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable key, Text value, Context context ) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } public void setup(...) {...} public void cleanup(...) {...} public void run(...) {...} }
value = “Ala ma kota”
Ala,1 ma,1 kota,1
Reducer<KEYIN,VALUEIN,KEYOUT,VALUEOUT>
public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context ) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } public void setup(...) {...} public void cleanup(...) {...} public void run(...) {...} }
kota,(1,1,1,1)
kota,4
Mainpublic int run(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } public static void main(String[] args) throws Exception { int res = ToolRunner.run(new Configuration(), new WordCount(),args); System.exit(res); }
yarn jar wc.jar WordCount /tmp/wordcount/input /tmp/wordcount/output
Co dalej?• Map Reduce w Javie
• Testowanie MRUnit
• Joins
• Avro
• Custom Key, Value
• Złączanie wielu zadań
• Custom Input, Output
38
Warsztat
40
Warsztat
41
Wprowadzenie do przetwarzania danych na
przykładzie Pig
42
Architektura Pig
43
Architektura Pig
44
Tryb Pracy
Interaktywny lub Wsadowy
45
Tryb Pracy
Lokalny lub Rozproszony
46
Tryb Pracy
Map Reduce lub Tez
47
Typy danych
48
int long float double
chararray datetime boolean
bytearray biginteger bigdecimal
Złożone typy
49
tuple bag map
Podstawy Pig Latin - wielkość liter
• A = LOAD 'data' USING PigStorage() AS (f1:int, f2:int, f3:int);B = GROUP A BY f1;C = FOREACH B GENERATE COUNT ($0);DUMP C;
• Nazwy zmiennych A, B, and C (tzw. aliasy) są case sensitive.• Wielkość liter jest też istotna dla:
• nazwy pól f1, f2, i f3• nazwy zmiennych A, B, C• nazwy funkcji PigStorage, COUNT
• Z wyjątkiem: LOAD, USING, AS, GROUP, BY, FOREACH, GENERATE, oraz DUMP
50
assert, and, any, all, arrange, as, asc, AVG, bag, BinStorage, by, bytearray, BIGINTEGER, BIGDECIMAL, cache, CASE, cat, cd, chararray, cogroup, CONCAT, copyFromLocal, copyToLocal, COUNT, cp, cross, datetime, %declare, %default, define, dense, desc, describe, DIFF, distinct, double, du, dump, e, E, eval, exec, explain, f, F, filter, flatten, float, foreach, full, generate, group, help, if, illustrate, import, inner, input, int, into, is, join, kill, l, L, left, limit, load, long, ls, map, matches, MAX, MIN, mkdir, mv, not, null, onschema, or, order, outer, output, parallel, pig, PigDump, PigStorage, pwd, quit, register, returns, right, rm, rmf, rollup, run, sample, set, ship, SIZE, split, stderr, stdin, stdout, store, stream, SUM, TextLoader, TOKENIZE, through, tuple, union, using, void
51
Słowa kluczowe
Pierwsze kroki
data = LOAD 'input' AS (query:CHARARRAY);
A = LOAD 'data' USING PigStorage('\t') AS (f1:int, f2:int, f3:int);
STORE A INTO '/tmp/result' USING PigStorage(';')
52
Pierwsze kroki
SAMPLEDESCRIBE
DUMPEXPLAIN
ILLUSTRATE
53
Kolejne kroki - operacje na danych
A = LOAD 'student' USING PigStorage() AS (name:chararray, age:int, semestre:int, scholarship:float);
B = FILTER A BY age > 20;
54
Kolejne kroki - operacje na danych
A = LOAD 'student' USING PigStorage() AS (name:chararray, age:int, semestre:int, scholarship:float);
B = FILTER A BY age > 20; C = LIMIT B 5;
55
Kolejne kroki - operacje na danych
A = LOAD 'student' USING PigStorage() AS (name:chararray, age:int, semestre:int, scholarship:float);
B = FILTER A BY age > 20; C = LIMIT B 5;
D = FOREACH C GENERATE name, scholarship*semestre as funds
56
Kolejne kroki - operacje na danych
A = LOAD 'student' USING PigStorage() AS (name:chararray, age:int, semestre:int, scholarship:float);
E = GROUP A by age
57
Kolejne kroki - operacje na danych
A = LOAD 'student' USING PigStorage() AS (name:chararray, age:int, semestre:int, scholarship:float);
E = GROUP A by age F = FOREACH E GENERATE group as age, AVG(A.scholarship)
58
Wydajność
Tez, Projekcje, Filtrowanie, Join
59
Co dalej?
UDF, PigUnit, Integracje
60
Warsztat
61
Wprowadzenie do analizy danych na przykładzie
Hive
62
Architektura
63
Unikalne cechy Hive
Zapytania SQL na plikach płaskich, np. CSV
64
Unikalne cechy Hive
Znaczne przyspieszenie analizy - nie potrzeba pisać Map Reduce Optymalizacja, wykonywanie części operacji w pamięci zamiast MR
65
Unikalne cechy Hive
Nieograniczone formy integracji - MongoDB, Elastic Search, HBase
66
Unikalne cechy Hive
Integracja narzędzi BI oraz DWH z Hive poprzez JDBC
67
Hive CLITryb Interaktywny
hive Tryb Wsadowy:
hive -e ‘select foo from bar’ hive -f ‘/path/to/my/script.q’ hive -f ‘hdfs://namenode:port/path/to/my/script.q’
więcej opcji: hive --help
68
Typy danychINT, TINYINT, SMALLINT, BIGINTBOOLEANDECIMALFLOAT, DOUBLESTRINGBINARYTIMESTAMPARRAY, MAP, STRUCT, UNIONDATECHARVARCHAR
69
Składnia zapytańSELECT, INSERT, UPDATE
GROUP BY
UNION
LEFT, RIGHT, FULL INNER, FULL OUTER JOIN
OVER, RANK
(NOT) IN, HAVING
(NOT) EXISTS
70
Data Definition Language
• CREATE DATABASE/SCHEMA, TABLE, VIEW, FUNCTION, INDEX • DROP DATABASE/SCHEMA, TABLE, VIEW, INDEX • TRUNCATE TABLE • ALTER DATABASE/SCHEMA, TABLE, VIEW • MSCK REPAIR TABLE (or ALTER TABLE RECOVER PARTITIONS) • SHOW DATABASES/SCHEMAS, TABLES, TBLPROPERTIES, PARTITIONS, FUNCTIONS, INDEX[ES], COLUMNS, CREATE TABLE
• DESCRIBE DATABASE/SCHEMA, table_name, view_name
71
Tabele
CREATE TABLE page_view(viewTime INT, userid BIGINT, page_url STRING, referrer_url STRING, ip STRING COMMENT 'IP Address of the User') COMMENT 'This is the page view table' PARTITIONED BY(dt STRING, country STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001' STORED AS TEXTFILE;
72
Pierwsze kroki w Hive
CREATE TABLE tablename1 (foo INT, bar STRING) PARTITIONED BY (ds STRING); LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename1;
INSERT INTO TABLE tablename1 PARTITION (ds='2014') select_statement1 FROM from_statement;
73
Pierwsze kroki w Hive
UPDATE tablename SET column = value [, column = value ...] [WHERE expression]
DELETE FROM tablename [WHERE expression]
74
Inne formaty plików? SerDe
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/
start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"
CREATE TABLE apachelog (
host STRING, identity STRING, user STRING, time STRING, request STRING, status STRING,
size STRING, referer STRING, agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?:
([^ \"]*|\".*\") ([^ \"]*|\".*\"))?"
)
STORED AS TEXTFILE;
75
Inne formaty plików? SerDe
CREATE TABLE table (
foo STRING, bar STRING)
STORED AS TEXTFILE; ← lub SEQUENCEFILE, ORC, AVRO lub PARQUET
76
Zalety, wady, porównanieHive Pig
deklaratywny proceduralny
tabele tymczasowe pipeline
polegamy na optymalizatorze bardziej ingerujemy w implementacje
UDF, Transform UDF, streaming
sterowniki sql data pipeline splits
77
Stinger
http://hortonworks.com/labs/stinger/78
Tips & Trickshive.vectorized.execution.enabled=true
ORC
hive.execution.engine=tez
John Lund Stone Getty Images79
Co dalej?
• Integracje z Solr, Elastic, MongoDB
• UDF
• multi table inserts
• JDBC
80
Warsztat
źródło:HikingArtist81
Wprowadzenie do NoSQL na podstawie
82
No SQL
• Not Only SQL
• Nierelacyjne
• Większość bez ACID
83
geekandpoke
Kiedy NoSQL
Skalowalność, Elastyczność
84
Przegląd baz nierelacyjnych
85
CAP theorem
86
Co to jest?• Key Value
• Column Family
• Wide Column
• Random access
• No SQL
• Liniowo skalowalny87
HBase Table (concept)adres (column family) wygląd (column
family)
rowkey miasto ulica kolor oczu
rowkey1 Warszawa Rubinowa Niebieskie
rowkey2 Kraków Poznańska
rowkey3 Pcim Brązowe
88
HBase Table …
rowkey
adres (column family) wygląd (column family)
miasto ulica kolor oczu
value timestamp value timestamp value timestamp
rowkey1 Warszawa 133334732
Rubinowa 133337743
Zielone 1344343424
Kasprowicza 144434453
rowkey2 Kraków 123333344 Poznańska 133333
rowkey3 Pcim 133333334 Brązowe 1343433444
89
HBase Table …….
90
{ rowkey1: {
adres: {
miasto:{
1333334732:Warszawa
},
ulica:{
1333337743: Kasprowicza,
1444434453: Rubinowa
}
}
}, [ other rowkeys..]
}
HBase Key Value
• (rowid,columnid,timestamp)->value
• (rowkey1,miasto,13334444)->Warszawa
91
High Level Architecture
Tabela
93
Architektura HBase
http://www.toadworld.com/platforms/nosql/w/wiki/356.hbase-storage.aspx94
HFile
95
API• shell
• thrift
• java client
• rest
• hive
• phoenix96
HBase Shell
hbase shell create 'testtable', {NAME=>'CF1'}, {NAME=>'CF2', VERSIONS=>2} put 'testtable', 'row1', 'CF1:col1', 'val1’ put 'testtable', 'row2', 'CF2:col7', 'val2' get 'testtable', 'row1' scan 'testtable', { STARTROW => 'row2', STOPROW => 'rowX'} scan 'testtable', {COLUMNS=>['CF1:']} scan 'testtable' , {COLUMNS=>['CF1:'], VERSIONS => 3} disable 'testtable' drop 'testtable'
97
Python Api na przykładzie HappyBase
1) Zainstaluj Happybase pip install happybase 2) Uruchom python 3) Dive into the code: import happybase connection = happybase.Connection('somehost', table_prefix='myproject') print connection.tables() table = connection.table('XYZ') row = table.row('row-key') print row['cf1:col1'] for key, data in table.scan(row_start='aaa', row_stop='xyz'): print key, data
table.put('row-key', {'cf:col1': 'value1', 'cf:col2': ‚value2'}) table.delete(‚row-key')
więcej: http://happybase.readthedocs.org/en/latest/index.html
98
Hive
CREATE [EXTERNAL] TABLE foo(rowkey STRING, a STRING, b STRING) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ('hbase.columns.mapping' = ':key,f:c1,f:c2') TBLPROPERTIES ('hbase.table.name' = 'bar');
f - column family c1, c2 - kolumny
99
Warsztat
źródło:HikingArtist100
Warsztatadres (column family) wygląd (column family)
rowkey miasto kod pocztowy ulica kolor włosów kolor oczu wzrost
95060200998 Warszawa 05-077 01-949
Jaspisowa Sokratesa blond Zielone
170 180 192
86010100222 Kraków Poznańska blond rudy 190
83010233331 Pcim brąz Brązowe 195
101
Monitorowanie i zarządzanie klastrem na
przykładzie Ambari
102
CLI• Yarn Administration Commands
• resourcemanager nodemanager proxyserver rmadmin daemonlog• HDFS
• User Commands • dfs • fsck
• Administration Commands • datanode dfsadmin namenode
• HBase • start-hbase.sh, stop-hbase.sh
• HCatalog, HiveServer, • Kafka, Storm, Tez, Spark, Oozie i inne • monitoring, konfiguracja, aktualizacja
103
Ambari
• zarządzanie klastrem
• konsola monitoringu
• instalacja nowych węzłów
• konfiguracja
• wygaszanie serwerów
104
Ambari
105
Now what?107
Chcesz wiedzieć więcej?Szkolenia pozwalają na indywidualną pracę z każdym uczestnikiem
• pracujemy w grupach 4-8 osobowych
• program może być dostosowany do oczekiwań grupy
• rozwiązujemy i odpowiadamy na indywidualne pytania uczestników
• mamy dużo więcej czasu :)
Szkolenie dedykowane dla Ciebie
Jesteś architektem lub team leaderem?
• na przekrojowym szkoleniu 5-dniowym omawiamy i ćwiczymy cały ekosystem Hadoopa
• na szkoleniu dedykowanym dla architektów dyskutujemy o projektowaniu systemów BigData
Jesteś analitykiem?
• na dedykowanym szkoleniu przećwiczysz w szczegółach Pig i Hive i rozwiążesz przykładowe problemy analityczne
Szkolenie dedykowane dla Ciebie
Jesteś programistą?
• szkolenie 3-dniowe pozwala w szczegółach zapoznać się z programowaniem zaawansowanych aspektów MapReduce w Javie i programowaniem w podejściu strumieniowym
Interesuje Cię całość zagadnienia BigData?
• Przetwarzanie Big Data z użyciem Apache Spark
• Bazy danych NoSQL - Cassandra
• Bazy danych NoSQL - MongoDB
Szkolenia
źródła
• HikingArtist.com - rysunki
• hortonworks.com - architektura HDP
• apache.org - grafiki Pig, Hive, Hadoop
dziękujępytania?
114
Wprowadzenie do technologii Big DataRadosław Stankiewicz - [email protected]
www.sages.com.pl