Hadoop MapReduce Join & Counter s primjerom
โก Pametni saลพetak
MapReduce spajanja kombiniraju dva velika skupa podataka na zajedniฤkom kljuฤu, bilo unutar mapera ili unutar reducera, dok MapReduce brojaฤi prikupljaju statistiku o poslu tako da se loลกi zapisi mogu mjeriti, a ne nagaฤati.
ล to je Join u MapReduceu?
Operacija spajanja MapReduce koristi se za kombiniranje dva velika skupa podataka. Meฤutim, ovaj proces ukljuฤuje pisanje puno koda za izvoฤenje stvarne operacije spajanja. Spajanje dva skupa podataka zapoฤinje usporedbom veliฤine svakog skupa podataka. Ako je jedan skup podataka manji u usporedbi s drugim skupom podataka, tada se manji skup podataka distribuira na svaki podatkovni ฤvor u klasteru.
Nakon ลกto se pridruลพite MapReduce distribuira se, Mapper ili Reducer koristi manji skup podataka za pretraลพivanje odgovarajuฤih zapisa iz velikog skupa podataka, a zatim kombinira te zapise kako bi formirao izlazne zapise.
Vrste pridruลพivanja
Ovisno o mjestu gdje se stvarno spajanje izvodi, spajanja u Hadoopu se klasificiraju u dvije vrste.
- Spoj na strani karte โ Kada maper izvrลกi spajanje, to se naziva spajanje na strani mape. U ovoj vrsti, spajanje se izvodi prije nego ลกto funkcija mapiranja zapravo konzumira podatke. Obavezno je da ulaz u svaku mapu bude u obliku particije i da bude sortiran. Takoฤer, mora postojati jednak broj particija i moraju biti sortirane prema kljuฤu spajanja.
- Spoj na smanjenoj strani โ Kada spajanje izvodi reduktor, to se naziva spajanje na strani redukcije. U ovom spajanju nije potrebno imati skup podataka u strukturiranom obliku (ili particioniranom). Ovdje, obrada na strani mape emitira kljuฤ spajanja i odgovarajuฤe korte obje tablice. Kao rezultat ove obrade, svi kortezi s istim kljuฤem spajanja padaju u isti reduktor, koji zatim spaja zapise s istim kljuฤem spajanja.
Cjelokupni tijek procesa spajanja u Hadoopu prikazan je na donjem dijagramu.

Nakon ลกto su dvije varijante razjaลกnjene, sljedeฤi odjeljak prolazi kroz spajanje na strani smanjenja na dvije male datoteke odjela.
Kako spojiti dva skupa podataka: primjer MapReduce
Postoje dva skupa podataka u dvije razliฤite datoteke (prikazano dolje). Kljuฤ Dept_ID je zajedniฤki u obje datoteke. Cilj je koristiti MapReduce Join za kombiniranje ovih datoteka.
Ulazni: Ulazni skup podataka je txt datoteka, NazivOdjela.txt i JaฤinaOdjela.txt
Preuzmite ulazne datoteke odavde
Osigurajte da imate Hadoop instalirano. Prije nego ลกto zapoฤnete s primjerom MapReduce Join-a, promijenite korisnika u 'hduser' (id koji se koristi tijekom konfiguracije Hadoop-a, moลพete se prebaciti na korisniฤki ID koji se koristi tijekom vaลกe konfiguracije Hadoop-a).
su - hduser_
Upit se mijenja na Hadoop raฤun, kao ลกto je prikazano u nastavku.
Korak 1) Kopirajte zip datoteku na mjesto po vaลกem izboru
Korak 2) Raspakujte Zip datoteku
sudo tar -xvf MapReduceJoin.tar.gz
Bivลกi/atracImena datoteka se pomiฤu dok tar raspakira arhivu.
Korak 3) Idite u direktorij MapReduceJoin/
cd MapReduceJoin/
Korak 4) Pokrenite Hadoop
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
Oba skripta ispisuju demone koje pokreฤu.
Korak 5) DeptStrength.txt i DeptName.txt su ulazne datoteke koje se koriste za ovaj primjer programa MapReduce Join.
Ove datoteke je potrebno kopirati u HDFS pomoฤu donje naredbe -
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal DeptStrength.txt DeptName.txt /
Korak 6) Pokrenite program pomoฤu donje naredbe-
$HADOOP_HOME/bin/hadoop jar MapReduceJoin.jar MapReduceJoin/JoinDriver/DeptStrength.txt /DeptName.txt /output_mapreducejoin
Naredba se prvo ponavlja, a zatim zadatak izvjeลกtava o svom napretku na konzoli.
Korak 7) Nakon izvrลกenja, izlazna datoteka (nazvana 'part-00000') bit ฤe pohranjena u direktoriju /output_mapreducejoin na HDFS-u.
Rezultati se mogu vidjeti pomoฤu suฤelja naredbenog retka
$HADOOP_HOME/bin/hdfs dfs -cat /output_mapreducejoin/part-00000
Rezultati se takoฤer mogu vidjeti putem web suฤelja kao-
Sada odaberite 'Pregledaj datoteฤni sustav' i idite do /output_mapreducejoin
Otvori dio-r-00000
Prikazani su rezultati
NAPOMENA: Imajte na umu da ฤete prije pokretanja ovog programa sljedeฤi put morati obrisati izlazni direktorij /output_mapreducejoin
$HADOOP_HOME/bin/hdfs dfs -rm -r /output_mapreducejoin
Alternativa je koriลกtenje drugog imena za izlazni direktorij.
Spojevi vam govore kako podaci izgledaju. Brojaฤi, o kojima ฤe biti rijeฤi u nastavku, govore vam kako se ponaลกao posao koji ih je proizveo.
ล to je brojaฤ u MapReduceu?
Brojaฤ u MapReduceu je mehanizam koji se koristi za prikupljanje i mjerenje statistiฤkih informacija o MapReduce poslovima i dogaฤajima. Brojaฤi ฤuvaju track razliฤitih statistika poslova u MapReduceu, poput broja izvrลกenih operacija i napretka operacije. Brojaฤi se koriste za dijagnosticiranje problema u MapReduceu.
Hadoop brojaฤi sliฤni su stavljanju poruke dnevnika u kod za mapiranje ili smanjenje. Ove informacije mogu biti korisne za dijagnozu problema u obradi posla MapReduce.
Obiฤno su ovi brojaฤi u Hadoopu definirani u programu (map ili reduce) i poveฤavaju se tijekom izvrลกavanja kada se dogodi odreฤeni dogaฤaj ili uvjet (specifiฤan za taj brojaฤ). Vrlo dobra primjena Hadoop brojaฤa je za track valjanih i nevaljanih zapisa iz ulaznog skupa podataka.
Vrste MapReduce brojaฤa
Postoje u osnovi 2 vrste MapReduce brojaฤa
- Ugraฤeni brojaฤi u Hadoopu: Postoje neki ugraฤeni Hadoop brojaฤi koji postoje po poslu. Ispod su ugraฤene grupe brojaฤa-
- Brojaฤi zadataka MapReduce โ Prikuplja podatke specifiฤne za zadatak (npr. broj ulaznih zapisa) tijekom vremena njegovog izvrลกavanja.
- Brojaฤi datoteฤnog sustava โ Prikuplja informacije poput broja bajtova koje je zadatak proฤitao ili napisao.
- Brojaฤi FileInputFormat โ Prikuplja informacije o odreฤenom broju bajtova proฤitanih putem FileInputFormat-a.
- Brojaฤi FileOutputFormat โ Prikuplja informacije o odreฤenom broju bajtova zapisanih putem FileOutputFormat-a.
- Brojaฤi poslova โ Ovi brojaฤi biljeลพe statistiku cijelog posla, kao ลกto je broj zadataka pokrenutih za posao.
- Korisniฤki definirani brojaฤi: Uz ugraฤene brojaฤe, korisnik moลพe definirati vlastite brojaฤe koristeฤi sliฤne funkcionalnosti koje pruลพaju programski jezici. Na primjer, u Java, 'enum' se koristi za definiranje korisniฤki definiranih brojaฤa.
๐ก Napomena o verziji: brojaฤe poslova odrลพavao je odjel za posaoTracker pod MRv1. Na YARN-u ta uloga pripada MapReduce ApplicationMasteru, tako da nazivi brojaฤa ostaju, ali se komponenta koja ih izvjeลกtava promijenila.
Posao ne moลพe deklarirati neograniฤen broj brojaฤa. mapreduce.job.counters.max postavka ograniฤava ukupan broj po zadatku na 120 prema zadanim postavkama, a zadatak koji deklarira viลกe ne uspijeva s LimitExceededException, pa su brojaฤi namijenjeni za nekolicinu agregiranih signala, a ne za brojanja po kljuฤu.
Primjer brojaฤa
Primjer MapClass s brojaฤima za brojanje nedostajuฤih i nevaลพeฤih vrijednosti. Ulazna datoteka koriลกtena u ovom vodiฤu Naลก skup ulaznih podataka je CSV datoteka, SalesJan2009.csv
public static class MapClass extends MapReduceBase implements Mapper<LongWritable, Text, Text, Text> { static enum SalesCounters { MISSING, INVALID }; public void map ( LongWritable key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException { //Input string is split using ',' and stored in 'fields' array String fields[] = value.toString().split(",", -20); //Value at 4th index is country. It is stored in 'country' variable String country = fields[4]; //Value at 8th index is sales data. It is stored in 'sales' variable String sales = fields[8]; if (country.length() == 0) { reporter.incrCounter(SalesCounters.MISSING, 1); } else if (sales.startsWith("\"")) { reporter.incrCounter(SalesCounters.INVALID, 1); } else { output.collect(new Text(country), new Text(sales + ",1")); } } }
Gornji isjeฤak koda prikazuje primjer implementacije brojaฤa u Hadoop MapReduceu.
Ovdje, Prodajni pultovi je brojaฤ definiran pomoฤu 'nabrajanje'. Koristi se za brojanje NEDOSTAJUฤIH i NEVAลฝEฤIH ulaznih zapisa.'
U isjeฤku koda, ako 'zemlja' ima nultu duljinu, tada mu nedostaje vrijednost i stoga se odgovarajuฤi brojaฤ SalesCounters.MISSING poveฤava.
Zatim, ako 'prodajni' polje poฤinje s ", tada se zapis smatra NEVAลฝEฤIM. To je naznaฤeno poveฤanjem brojaฤa SalesCounters.INVALID.
๐ก Napomena API-ja: Gornji isjeฤak koristi original org.apache.hadoop.mapred API, gdje MapReduceBase je Mapper suฤelje, OutputCollector i Reporter pojavljuju se odvojeno. Trenutni kod je napisan uz org.apache.hadoop.mapreduce, gdje je jedan Context zamjenjuje kolektora i izvjestitelja, a brojaฤ se poveฤava za context.getCounter(SalesCounters.MISSING).increment(1)Koncept brojaฤa je identiฤan u oba.











