Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Hadoop ja MapReduce
1. Hadoop
Advent of Big Data
”if you know all the questions you’re going to ask from your data, you
probably don’t need that data”
P. Heinonen
2. Hadoop
• Hadoop on kehitetty tekemään monimutkaisia
analyysejä, yksityiskohtaista ja hyvin
erikoistunutta tiedonlouhintaa ja laskentaa
kustannustehokkaasti.
• Käyttötapauksia on mm. hakuindeksi, logien
prosessointi, suosittelujärjestelmät,
tietovarastot, video- ja kuva-analyysi.
3. Hadoop
• Apachen projekti joka sisältää:
– Suorituskykyisen hajautetun tiedostojärjestelmän HDFS:n
– MapReduce frameworkin
• HDFS ja MapReduce muodostavat Hadoopin ytimen
• HDFS mahdollistaa suuria rakenteellisten ja ei-
rakenteellisten datamassojen tallennuksen
tiedostojärjestelmään (jopa petatavuja)
• Tiedostojärjestelmä on optimoitu suurille tiedostoille
• Hadoop Streaming
– API joka tarjoaa STDIN syötön MapReduce:lle. Mahdollistaa
ohjelmoinnin myös muulla kuin Javalla.
• Aliprojekteja:
– Hbase, Pig, Hive
4. MapReduce
• Processing framework joka mahdollistaa yksinkertaisella
koodilla suuren datamassan tiedonlouhinnan.
• MapReduce on se jonka kanssa ohjelmoija ja tiimi
pääasiassa tekee hommia. Muu Hadoop on ”good to know”
• Automatisoi rinnakkaislaskennan ja datan jakelun klusteriin
• Vikasietoisuus automaattista
• Hoitaa myös I/O skeduloinnin
• Tarjoaa prosessin tilan monitoroinnin
• Helppo tehostaa: lisätään koneita lisää klusteriin
5. MapReduce ohjelmointimalli
• Prosessointi on kaksivaiheinen: Map ja
Reduce.
• Jokaisella vaiheella on key-value-pari inputtina
ja outputtina.
• Key-value-pari on jokin sellainen pari joka
merkitsee ohjelmoijalle ja tiimille ja datalle
jotain.
• MapReducelle ohjelmoidaan kaksi funktiota:
Map ja Reduce.
6. MapReduce ohjelmointimalli
• Input ja Output ovat key/value-pareja
• Ohjelmoija määrittelee kaksi funktiota:
– map (in_key, in_value) -> list(out_key, intermediate_value)
• Map prosessoi input key/value-parin
• Tuottaa intermediate-parin
– reduce (out_key, list(intermediate_value)) -> list(out_value)
• Yhdistää intermediate valuet per avain
• Tuottaa mergetyn datasetin output arvoista.
• Map vaiheen toiminta kokonaisuudessaan voidaan ajatella lambda-
funktiona: Square(1,2,3,4,5,6) = 2,4,9,16,25,36
• Ja Reduce: Sum(2,4,9,16,25,36) = 92
• Ohjelmointikielenä Java mutta myös muita kieliä jo tuettuna.
• Hadoop Stream tarjoaa vaihtoehtoisen tavan toteuttaa MapReduce
vaikka Pythonilla
• Hadoop Pipe tarjoaa natiivin koodauksen C++:lla
7. Ohjelmointiesimerkki
• Yleisin esimerkki, pseudokoodina. Sanojen
tiheyden laskenta suuresta datamäärästä:
map(String input_key, String input_value):
// input_key: document name
// input_value: document contents
for each word w in input_value:
output_intermediate, "1");
reduce(String output_key, Iterator intermediate_values):
// output_key: a word
// output_values: a list of counts
int result = 0;
for each v in intermediate_values:
result += ParseInt(v);
output(AsString(result));
8. MapReduce-prosessi
1. MapReduce pilkkoo datan 64-128MB paloihin
ja jakaa klustereille joissa kukin MapReducer
kopio käynnistyy.
2. Yksi MapReducereista on Master ja muut
workereita jotka saavat työn masterilta.
Mallissa on kaksi tehtävää, Map ja Reduce.
Master valitsee vapaan workerin ja jakaa sille
joko Map tai Reduce tehtävän.
3. worker joka suorittaa Map tehtävää parsii
datasta key/value-parit ja välittää jokaisen
parin Map-funktiolle jonka key/value-output
bufferoidaan muistiin. Tätä dataa kutsutaan
ns. intermediate-dataksi.
4. Tietyin väliajoin intermediate-data talletetaan
workerin lokaalille levylle, partitioidaan ns. R-
osioon partitioning-funktiolla ja osoite levyllä
välitetään masterille joka edelleen forwardoi
osoitteet Reduce workereille.
5. Kun Reduce-worker vastaanottaa masterilta
osoitteen, se lukee RPC:llä Map workerin
tallentaman lokaalin intermediate-datan.
Datan luettuaan Reduce-worker sorttaa datan
avaimen perusteella eli kaikki saman avaimen
omaava data groupataan yhteen.
6. Reduce worker käy läpi groupatun
intermediate-datan ja välittää jokaisen
yksilöivän avaimen ja sitä vastaavan datasetin
Reduce-funktiolle. Reduce-funktion output
Huom: Single-nodena prosessi on täysin sama, ts. MapReduce lisätään output-tiedostoon reduce-partitioon.
prosessin kannalta ei ole merkitystä onko klusterissa 1 vai 1000 7. Lopulta MapReduce on tuottanut inputista
halutun outputin hadoopin hdfs:lle.
konetta.
9. M ja R suoritus tarkemmin
Key/value-parin operointi ja ryhmittely Map ja Reduce workereissa
10. M ja R rinnakkainen suoritus
Key/value-parin operointi ja ryhmittely Map ja Reduce workereissa
11. MapReduce esimerkki
• Weppisaitin indeksointi
– Map-vaihe generoi intermediate key/value-parin missä key on sana ja
value on dokumentti
– Reduce-vaihe aggregoi arvot ja tuottaa outputin
• Weppisaitin linkkien indeksointi (PageRank)
– Sama MapReduce prosessi, tällä kertaa intermediate key/value-parin
key on linkki ja value on linkkien esiintymistiheys. Jälleen Reduce-vaihe
ryhmittelee datan ja tuottaa lopullisen outputin
• MapReduce mahdollistaa dynaamisen datan indeksoinnin ja
ryhmittelyn. Ei siis tarvitse etukäteen määrittää tietokannan
rakenteita.
• Key/value-parin key ja value voivat olla mitä tahansa mikä nähdään
tarpeelliseksi. ”key/value-pair is something meaningful to you and
your team and to your data”
12. MapReduce vikasietoisuus
• Worker failure
– Vika havaitaan säännöllisesti pingaamalla “worker
heartbeat”
– Suoritetaan ajo uudelleen
– Ajettu suoritus ilmoitetaan masterille
• Master failure:
– Hyvin poikkeuksellinen virhetilanne, ajettava käsin
uudelleen
• Luotettava: vaikka 90% klusterin nodeista kaatuisi
niin laskenta onnistuisi lopulla 10%:lla.
13. Hadoopin arkkitehtuuri
• HDFS ja MapReduce
• Ohjelmoijan tai muunkaan tiimin ei tarvitse tuntea paljonkaan Hadoopin arkkitehtuuria; kaikki tapahtuu pinnan
alla automaattisesti. Ainoastaan MapReduce:n Map ja Reduce funktioiden ohjelmointi jää tehtäväksi.
14. HDFS
• Hajautettu ja skaalautuva tiedostojärjestelmä
• - Javalla toteutettu
• - HDFS klusterissa on NameNode joka tallettaa metadataa ja useita DataNodeja joihin tallentuu
prosessoitava varsinainen data.
• NameNode (Master): Mappaa datan blokkeihin ja lähettää DataNodeille
• DataNode: workerit
• Tiedostojärjestelmä käyttää TCP/IP:tä kommunikointiin (RPC)
15. Hadoop ja C++
• Hadoop Pipes
– Bindaus kirjasto natiiville C++ koodille
– Toimii lokaalisti socketeilla
• Suorituskyky parempi mutta riskinä tietoturva
ja suora yhteys Kerneliin
17. Hadoop streaming
• Mahdollistaa piipun käytön ‘|’
• Voi luoda yksinkertaisia map ja reduce
ohjelmia suoraan komentorivillä
– stdin ja stdout tekee loput
– Esim pythonilla map ja reduce josta luetaan
komentorivilta ja kirjoitetaan komentoriville
– Myös batch scriptillä
19. HBase
• Hajautettu tietovarasto joka skaalautuu
horisontaalisesti hyvin ja pystyy käsittelemään
useiden petatavujen kokoista indeksiä
• Suunniteltu Hadoopin HDFS:n päälle
• Integroituu MapReducen kanssa
• Hajautettu malli
• Table-like rakenne
– Multidimensional map
• Skaalautuva, hyvä suorituskyky
20. Miksi Hbase?
• Perinteinen RDBMS ei skaalaudu suurille
hajautetuilla datamassoille
• RDBMS hajautus mahdollista jossain määrin
toteuttaa replikoinnilla mutta hankala ylläpitää
• Hajautettu datan jakaminen replikoinnilla vaatii:
– Monimutkaisia kyselyitä
– Kyselyjä hidastavia joineja, mahdollisesti triggereitä
sekä foreign key constraintteja.
21. Miksi Hbase?
• MapReduce prosessin mahdollisuus luo
kustannustehokkaan keinon hajauttaa data
• Sharding
– Relaatiotietokannat eivät mahdollista datan
pilkkomista ja jakamista pienempiin osiin joita
prosessoidaan hajautetusti.
– Sharding on ns. Horisontaalinen partitiointi
• Data pilkotaan osiin ja jaetaan ”pirstaleina” klusterin
palvelimille.
• Esim: Customer pilkotaan osiin, jokainen osa sisältää jonkun
palasen Customeriin liittyvää dataa ja jokainen operaatio
suoritetaan osissa.
23. Pig latin
• Datan prosessoinnille kehitetty korkean tason
ohjelmointikieli
• Abstrahoi MapReducen Java-käskyt
yksinkertaisemmaksi notaatioksi vähän kuten SQL
tekee RDBMS:lle.
• Helppo tapa toteuttaa Hadoopille MapReduce ohjelma
• Esimerkki sanojen esiintymistiheyden laskennasta.
WordCount MapReduce:
nettisivujenSisalto = load '/hadoop-testit/indeksoidut_nettisivut.txt';
sanat = foreach nettisivujenSisalto generate flatten(TOKENIZE((chararray)$0)) as word;
sanat = filter sanat by word matches 'w+';
gruupatutSanat = group sanat by word;
sanaDensity = foreach gruupatutSanat generate COUNT(C) as count, group as word;
jarjesteltySanajoukko = order sanaDensity by count desc;
store jarjesteltySanajoukko into '/hadoop-testit/nettisivujen-sanatiheys.txt';
Ylläoleva ohjelma ei ole pseudokoodia vaan se aidosti generoi Hadoopille
MapReduce rinnakkaislaskentatehtävän jonka voi hajauttaa klusterin tuhannelle
eri koneelle laskemaan indeksoitavien nettisivujen sanojen lukumäärää.
24. Data-analyysiesimerkki
Hae 10 eniten vierailtua sivua per kategoria
Visits Url Info
User Url Time Url Category PageRank
Amy cnn.com 8:00 cnn.com News 0.9
Amy bbc.com 10:00 bbc.com News 0.8
Amy flickr.com 10:05 flickr.com Photos 0.7
Fred cnn.com 12:00 espn.com Sports 0.9
25. Pig-ohjelman dataflow
Load Visits
Group by url
Foreach url
Load Url Info
generate count
Join on url
Group by category
Foreach category
generate top10 urls
26. Itse Pig-ohjelma
visits = load ‘/data/visits’ as (user, url, time);
gVisits = group visits by url;
visitCounts = foreach gVisits generate url, count(visits);
urlInfo = load ‘/data/urlInfo’ as (url, category, pRank);
visitCounts = join visitCounts by url, urlInfo by url;
gCategories = group visitCounts by category;
topUrls = foreach gCategories generate top(visitCounts,10);
store topUrls into ‘/data/topUrls’;