hadoop ja mapreduce
TRANSCRIPT
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
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.
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
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
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.
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
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));
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 lisätään output-tiedostoon reduce-partitioon.
7. Lopulta MapReduce on tuottanut inputista halutun outputin hadoopin hdfs:lle.
Huom: Single-nodena prosessi on täysin sama, ts. MapReduce prosessin kannalta ei ole merkitystä onko klusterissa 1 vai 1000 konetta.
M ja R suoritus tarkemmin Key/value-parin operointi ja ryhmittely Map ja Reduce workereissa
M ja R rinnakkainen suoritus Key/value-parin operointi ja ryhmittely Map ja Reduce workereissa
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”
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.
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.
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)
Hadoop ja C++
• Hadoop Pipes
– Bindaus kirjasto natiiville C++ koodille
– Toimii lokaalisti socketeilla
• Suorituskyky parempi mutta riskinä tietoturva ja suora yhteys Kerneliin
Hadoop ja Python
• Optio 1: Käytä Jythonia
– Jython on subset Pythonista, hitaampi
• Optio 2: Käytä Hadoop Streamia
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ä
HBase
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
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.
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.
Pig latin
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ää.
Data-analyysiesimerkki
User Url Time
Amy cnn.com 8:00
Amy bbc.com 10:00
Amy flickr.com 10:05
Fred cnn.com 12:00
Hae 10 eniten vierailtua sivua per kategoria
Url Category PageRank
cnn.com News 0.9
bbc.com News 0.8
flickr.com Photos 0.7
espn.com Sports 0.9
Visits Url Info
Pig-ohjelman dataflow
Load Visits
Group by url
Foreach url
generate count Load Url Info
Join on url
Group by category
Foreach category
generate top10 urls
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’;
Yahoon Sikajengi