Hadoop MapReduce Join & Counter esimerkin avulla
⚡ Älykäs yhteenveto
MapReduce-liitokset yhdistävät kaksi suurta tietojoukkoa jaetulla avaimella joko mapperin tai reduktorin sisällä, kun taas MapReduce-laskurit keräävät tilastoja työstä, jotta virheellisiä tietueita voidaan mitata arvaamisen sijaan.

Mikä on Join MapReducessa?
MapReduce Join -operaatiota käytetään kahden suuren tietojoukon yhdistämiseen. Tämä prosessi vaatii kuitenkin paljon koodia varsinaisen liitosoperaation suorittamiseksi. Kahden tietojoukon yhdistäminen aloitetaan vertaamalla niiden kokoa. Jos toinen tietojoukko on pienempi kuin toinen, pienempi tietojoukko jaetaan klusterin jokaiselle datasolmulle.
Kun olet liittynyt mukaan MapReduce on hajautettu, joko Mapper tai Reducer käyttää pienempää tietojoukkoa etsiäkseen vastaavia tietueita suuresta tietojoukosta ja yhdistää sitten nämä tietueet muodostaakseen tulostietueita.
Liittymistyypit
Hadoopissa liitokset luokitellaan kahteen tyyppiin riippuen siitä, missä varsinainen liitos suoritetaan.
- Kartanpuoleinen liitos — Kun liitoksen suorittaa kartoittaja, sitä kutsutaan kartan puoleiseksi liitokseksi. Tässä tyypissä liitos suoritetaan ennen kuin kartoitusfunktio varsinaisesti käsittelee dataa. On välttämätöntä, että jokaisen kartan syöte on osion muodossa ja lajitellussa järjestyksessä. Lisäksi osioita on oltava yhtä monta ja ne on lajiteltava liitosavaimen mukaan.
- Pienennyspuoleinen liitos — Kun liitoksen suorittaa reduktori, sitä kutsutaan reduktiopuolen liitokseksi. Tässä liitoksessa ei tarvitse olla strukturoidussa (tai osioidussa) muodossa olevaa tietojoukkoa. Tässä karttapuolen käsittely tuottaa liitosavaimen ja vastaavat molempien taulukoiden tuplet. Tämän käsittelyn seurauksena kaikki saman liitosavaimen omaavat tuplet kuuluvat samaan reduktoriin, joka sitten yhdistää saman liitosavaimen omaavat tietueet.
Hadoopin liitosprosessin yleinen prosessi on kuvattu alla olevassa kaaviossa.

Kun kaksi varianttia on selvitetty, seuraavassa osiossa käydään läpi kahden pienen osastotiedoston liitos pienennyspuolella.
Kahden tietojoukon yhdistäminen: Esimerkki MapReduce
Kahdessa eri tiedostossa on kaksi datajoukkoa (alla). Avaimen Dept_ID on yhteinen molemmissa tiedostoissa. Tavoitteena on yhdistää nämä tiedostot MapReduce Join -funktiolla.
input: Syötetietojoukko on txt-tiedosto, OsastonNimi.txt ja OsastonVahvuus.txt.
Varmista, että sinulla on Hadoop asennettu. Ennen kuin aloitat MapReduce Join -esimerkin varsinaisen prosessin, muuta käyttäjätunnukseksi 'hduser' (samaa tunnusta käytettiin Hadoop-määrityksessä, voit vaihtaa Hadoop-määrityksessä käytettyyn käyttäjätunnukseen).
su - hduser_
Kehotteessa näkyy Hadoop-tili, kuten alla on esitetty.
Vaihe 1) Kopioi zip-tiedosto valitsemaasi paikkaan
Vaihe 2) Pura zip-tiedosto
sudo tar -xvf MapReduceJoin.tar.gz
Entinentracted-tiedostonimet vierivät ohi tarin purkaessa arkistoa.
Vaihe 3) Siirry hakemistoon MapReduceJoin/
cd MapReduceJoin/
Vaihe 4) Käynnistä Hadoop
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
Molemmat skriptit tulostavat käynnistämänsä demonit.
Vaihe 5) DeptStrength.txt ja DeptName.txt ovat syötetiedostoja, joita käytetään tässä MapReduce Join -esimerkkiohjelmassa.
Nämä tiedostot on kopioitava kohteeseen HDFS käyttämällä alla olevaa komentoa -
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal DeptStrength.txt DeptName.txt /
Vaihe 6) Suorita ohjelma alla olevalla komennolla-
$HADOOP_HOME/bin/hadoop jar MapReduceJoin.jar MapReduceJoin/JoinDriver/DeptStrength.txt /DeptName.txt /output_mapreducejoin
Komento toistetaan ensin, ja työ raportoi sitten edistymisensä konsolissa.
Vaihe 7) Suorituksen jälkeen tulostiedosto (nimeltään 'part-00000') tallennetaan HDFS:n hakemistoon /output_mapreducejoin.
Tulokset näkyvät komentorivikäyttöliittymällä
$HADOOP_HOME/bin/hdfs dfs -cat /output_mapreducejoin/part-00000
Tulokset ovat nähtävissä myös verkkokäyttöliittymän kautta mm.
Valitse nyt 'Selaa tiedostojärjestelmää' ja siirry kohtaan /output_mapreducejoin
Avaa osa-r-00000
Tulokset näytetään
HUOMAUTUS: Huomaa, että ennen kuin suoritat tämän ohjelman seuraavan kerran, sinun on poistettava tuloshakemisto /output_mapreducejoin
$HADOOP_HOME/bin/hdfs dfs -rm -r /output_mapreducejoin
Vaihtoehtona on käyttää eri nimeä tulostehakemistolle.
Liitokset kertovat, miltä data näyttää. Seuraavaksi käsiteltävät laskurit kertovat, miten datan tuottanut työ on käyttäytynyt.
Mikä on MapReducen laskuri?
MapReducen laskuri on mekanismi, jota käytetään MapReducen töiden ja tapahtumien tilastotietojen keräämiseen ja mittaamiseen. Laskurit pitävät track erilaista MapReducen työtilastoa, kuten tapahtuneiden toimintojen lukumäärä ja toiminnon edistyminen. Laskureita käytetään MapReducen ongelmien diagnosointiin.
Hadoop-laskurit ovat samanlaisia kuin lokiviestin lisääminen kartan tai pienennyskoodiin. Nämä tiedot voivat olla hyödyllisiä MapReduce-töiden käsittelyn ongelman diagnosoinnissa.
Tyypillisesti nämä Hadoop-laskurit määritellään ohjelmassa (map tai reduce) ja niitä kasvatetaan suorituksen aikana, kun tietty tapahtuma tai ehto (kyseiselle laskurille ominainen) tapahtuu. Erittäin hyvä Hadoop-laskurien sovellus on track kelvollista ja epäkelvollista tietuetta syöttöaineistosta.
MapReduce-laskurityypit
MapReduce-laskurit ovat periaatteessa kahdenlaisia
- Hadoopin sisäänrakennetut laskurit: Työtä kohden on joitain sisäänrakennettuja Hadoop-laskuria. Alla on sisäänrakennetut vastaryhmät-
- MapReduce Task Counters — Kerää tehtäväkohtaisia tietoja (esim. syötetietueiden lukumäärän) suorituksen aikana.
- Tiedostojärjestelmän laskurit — Kerää tietoja, kuten tehtävän lukemien tai kirjoittamien tavujen määrän.
- FileInputFormat laskurit — Kerää tietoa FileInputFormat-funktion kautta luetusta tavumäärästä.
- FileOutputFormat laskurit — Kerää tietoa FileOutputFormatin kautta kirjoitetusta määrästä tavuja.
- Työlaskurit — Nämä laskurit tallentavat koko työtä koskevia tilastoja, kuten työssä käynnistettyjen tehtävien määrän.
- Käyttäjän määrittämät laskurit: Sisäänrakennettujen laskureiden lisäksi käyttäjä voi määrittää omia laskureitaan käyttämällä ohjelmointikielten tarjoamia samankaltaisia toimintoja. Esimerkiksi Java, 'enum'-arvoa käytetään käyttäjän määrittämien laskurien määrittämiseen.
💡 Versiohuomautus: työpaikkalaskurit ylläpidettiin Job-palvelun toimestaTracker MRv1:ssä. YARN:ssa kyseinen rooli kuuluu MapReduce ApplicationMasterille, joten laskurien nimet säilyvät, mutta niitä raportoiva komponentti on muuttunut.
Työ ei voi määrittää rajatonta määrää laskureita. mapreduce.job.counters.max asetus rajoittaa työkohtaisen kokonaismäärän oletusarvoisesti 120:een, ja työ, joka ilmoittaa enemmän, epäonnistuu ja aiheuttaa LimitExceededException, joten laskurit on tarkoitettu kouralliselle koostesignaaleja eikä näppäinkohtaisia yhteenvetoja.
Esimerkki laskurit
Esimerkki MapClass-luokasta, jossa on laskurit puuttuvien ja virheellisten arvojen määrän laskemiseen. Tässä opetusohjelmassa käytetty syöttödatatiedosto. Syötedatajoukkomme on CSV-tiedosto nimeltä 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")); } } }
Yllä oleva koodinpätkä näyttää esimerkin laskurien toteutuksesta Hadoop MapReducessa.
Täällä Myyntilaskurit on laskuri, joka on määritelty käyttämällä 'ENUMSitä käytetään PUUTTUVIEN ja VÄÄRIEN syötetietueiden laskemiseen.
Koodinpätkässä, jos 'maa'-kentän pituus on nolla, sen arvo puuttuu ja vastaavaa laskuria SalesCounters.MISSING kasvatetaan.
Seuraavaksi, jos 'myyntiJos '-kenttä alkaa merkkijonolla “, tietue katsotaan virheelliseksi. Tämä ilmaistaan kasvavalla laskurilla SalesCounters.INVALID.
💡 API-huomautus: yllä oleva katkelma käyttää alkuperäistä org.apache.hadoop.mapred API, jossa MapReduceBase, The Mapper käyttöliittymä, OutputCollector ja Reporter näkyvät erikseen. Nykyinen koodi on kirjoitettu org.apache.hadoop.mapreduce, jossa yksittäinen Context korvaa keräilijän ja raportoijan, ja laskuria kasvatetaan arvolla context.getCounter(SalesCounters.MISSING).increment(1)Laskurin konsepti on molemmissa identtinen.











