Bitna komponenta Hadoop-a, Map Reduce

U prošlom tekstu sam pisao o HDFS i njegovom značaju za Hadoop. Kada bismo imali samo Hadoop sa HDFS-om i Common paketom, to bi bila samo platforma za skladištenje velike količine podataka. Postavlja se pitanje zašto samo skladištiti podatke, to je glupo, a i skupo. Zato Hadoop ima posebnu komponentu koja će obradovati programere, MapReduce.

Šta je MapReduce?

MapReduce je programski model za procesiranje velikih količina podataka. Bitno je napomenuti da se njegov algoritam izvršava paralelno i distribuirano. Bliže govoreći, ako imamo klaster od tri servera, algoritam će se izvršavati paralelno, odnosno u isto vreme na sva tri servera.

MapReduce

Map Reduce

Ovaj model se može posmatrati i kao dve odvojene celine, deo Map i deo Reduce.

Map – Maper služi da sortira i filtrira podatke. Ovo može da bude i neko jednostavno sortiranje, sve zavisi šta vam treba. To može biti sortiranje studenata po prezimenu, na primer.

Reduce – Reducer sumira podatke koje je obradio Maper, odnosno na datom primeru sada lakše možemo izbrojati studente po nekom kriterijumu.

Maper ili Reducer možemo sresti i u funkcionalnom programiranju. Na primer, običan Bubble sort je Maper koji sortira podatke. Naravno, ne treba ovo posmatrati bukvalno i misliti da je prelako. Prava moć ovog modela je upravo to što imamo zajedno Mapere i Reducere.

Možda se sada neko pita: “Šta će meni Hadoop, pa ja mogu sve ovo da radim na računaru sa instaliranim Eklipsom ili Visual Studiom?”. To je logično pitati se kada posmatramo samo MapReduce bez razmišljanja o drugim komponentama Hadoop-a. Pre nego što je počeo da se koristi u Hadoop-u, MapReduce model se koristio u Google-u, ali nije bio toliko iskorišćen. Prava moć ovog modela se vidi kada se kombinuje sa HDFS-om.

U Hadoop verziji 1 MapReduce je služio za upravljanje resursima i za procesiranje podataka, dok je sada, u verziji 2, upravljanje resursima preuzela komponenta YARN o kojoj ću naknadno pisati. Znači, ako instalirate verziju 2 Hadoop-a, što i preporučujem, MapReduce služi samo za procesiranje podataka.

Logički model

Trebalo bi da napomenem logiku ovog modela, odnosno da pišem o strukturi podataka koju poštuje MapReduce. Map funkcija i Reduce funkcija poštuju strukturu par (ključ, vrednost). Map funkcija na početku prima jedan par (ključ, vrednost) u nekom domenu (podataka) i vraća listu parova u drugačijem domenu.

Map (key_1, value_1) —> list (key_2, value_2)

Ovo se izvršava paralelno. Kada se završi taj deo, MapReduce sakuplja sve iste ključeve iz liste i grupiše ih.

Nakon grupisanja nastupa Reduce funkcija koja se primenjuje paralelno na svaku grupu.

Reduce (key_2, list (value_2)) —> list (value_3)

Razlika u odnosu na funkcionalno programiranje je to što Reduce funkcija vraća list (ključ, vrednost) kao listu svih vrednosti, dok kod funkcionalnog programiranja dobijamo samo jednu vrednost.

HDFS i MapReduce

Map Reduce HDFS

Map Reduce HDFS

Prava moć ovog modela leži u kombinaciji sa HDFS-om. Već sam pisao o HDFS-u, ali da se podsetimo – svi podaci u HDFS-u se skladište na DataNode-u kao blokovi i na NameNode-u se čuvaju meta podaci o tim blokovima. Logički se nameće zaključak da kada su podaci podeljeni u manjim blokovima, lakše ih je obraditi. Sa ovakvim skladištenjem podataka lakše je Map funkciji da ih grupiše. Bitno je zapamtiti da MapReduce model radi sa podacima, odnosno blokovima, i to nikako ne znači da se za par (ključ, vrednost) uzima išta iz NameNoda. Prvo sam pomislio da ključ uzima vrednost iz NameNode-a, ali ne. Par (ključ, vrednost) znači “grupiši mi sva imena studenata po godini studija iz svih blokova (bez kopiranih)”, a onda Reduce sve to lepo spakuje i dobijemo rezultate sa svih blokova u bilo kom serveru izabranog klastera.

Za šta se koristi?

MapReduce model ima praktičnu primenu u Hadoop-u, odnosno mogu da kažem da programer ima dodira sa ovom komponentom. Kao što sam gore napisao, Hadoop samo sa HDFS-om je BigData skladište, što znači da imamo podatke i ništa više. Danas nije bitno imati novac da biste imali moć, potrebno je imati informaciju koju možete valjano da iskoristite. MapReduce je bitan deo pretvaranja podataka u informacije. Ako mogu da skladištim velike količine podataka i iz njih nešto izvučem, to je posao, tako se zarađuje novac i stiče moć, dok je skladištenje samo po sebi trošak. Danas velike firme poput Facebook-a, Twitter-a i ostalih koriste upravo Hadoop kako bi saznale naše navike, želje i to iskoristili da poboljšaju uslugu ili čak nešto što se nama ne sviđa, ali neću ulaziti u tu problematiku.

MapReduce Primer

Map Reduce Primer

Programski jezici

Kada sam počinjao sa Hadoop-om zanimalo me je koji programski jezik mogu da koristim da bih pisao MapReduce programe i koristio ih za analizu nekih podataka koje sam uspeo da sakupim. Odgovor je da se može koristiti bilo koji jezik, ali ipak se nekako sve svodilo na Javu. Meni u tom trenutku baš i nije odgovaralo da koristim nju jer sam na nekim drugim poslovima uveliko zagrebao PHP i Ruby. Bukvalno se par dana svelo na razmišljanje u kom jeziku ću pisati na početku. Malo pretrage na Internetu i naišao sam na nešto što se zove Pig Latin. Moram da priznam, delovalo je jako čudno – “svinja”. Našao sam primer koda u Javi koji je imao 140 linija, a u Pigu svega 15. To me je najviše nateralo da počnem da učim Pig. Sami razmislite šta je lakše i bolje. Naravno, Pig nije ultimativno rešenje za sve probleme i svakako preporučujem da se naoružate dobrim znanjem Jave i Python-a, ako želite da budete najbolji u pisanju MapReduce programa. O Pigu ću pisati u nekim od narednih tekstova, jer je on deo Hadoop ekosistema i može da vam uštedi dosta vremena, a i naučićete nešto novo.

Jedan savet: vodite računa kada pišete MapReduce kod da se pridržavate logike i da dobro savladate ovaj model. Iz iskustva znam da se može desiti da napišete neki kod koji je sintaksički ispravan, koji se čak i izvrši, ali bez rezultata samo zato što niste uradili MAP pa REDUCE.

Sledeći tekst je o YARN-u, pa da hadupujemo zajedno!