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.

  • 🔘 Liittymisen perusasiat: Kahdesta datajoukosta pienempi jaetaan jokaiselle datasolmulle ja sitä käytetään hakupuolena.
  • ☑️ Kartan puoleinen liitos: Edellyttää, että jokainen syöte osioidaan, jaetaan tasaisesti ja lajitellaan liitosavaimen mukaan ennen map-funktion suorittamista.
  • Pienennyspuoleinen liitos: Ei tarvitse osiointia, koska jokainen liitosavaimen jakava tuple päätyy samaan reduktoriin.
  • 🧪 Toimiva esimerkki: OsastonNimi.txt ja OsastonVahvuus.txt kopioidaan HDFS:ään ja yhdistetään Dept_ID:n avulla pakatun jar-tiedoston avulla.
  • 🛠️ Laskurityypit: Jokaisen työn mukana toimitetaan viisi sisäänrakennettua laskuriryhmää, ja käyttäjän määrittämät laskurit on määritelty Java luettelo
  • ⚠️ Laskurin käyttö: Kunkin puuttuvan tai virheellisen tietueen laskurin kasvattaminen muuttaa datan laatuongelmat numeroksi työraportissa.

Hadoop MapReduce -liitos- ja laskuriopas toimineella esimerkillä

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.

  1. 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.
  2. 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.

Prosessivuokaavio, jossa vertaillaan karttapuolen ja pelkistyspuolen liitoksia Hadoopissa
Liitostyypit Hadoop MapReducessa

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.

Ensimmäinen syöttötiedosto, joka listaa osastojen tunnukset osastojen nimien rinnalla

Tiedosto 1
Toinen syöttötiedosto, joka listaa osastojen tunnukset osastojen vahvuusarvojen rinnalla

Tiedosto 2

input: Syötetietojoukko on txt-tiedosto, OsastonNimi.txt ja OsastonVahvuus.txt.

Lataa syöttötiedostot täältä

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.

Pääte sen jälkeen, kun olet vaihtanut hduser-tilille su-komennolla

Vaihe 1) Kopioi zip-tiedosto valitsemaasi paikkaan

Ladattu MapReduceJoin-arkisto sijoitettu valittuun työhakemistoon

Vaihe 2) Pura zip-tiedosto

sudo tar -xvf MapReduceJoin.tar.gz

Entinentracted-tiedostonimet vierivät ohi tarin purkaessa arkistoa.

Tiedostojen konsoliluettelo, esim.tracted tiedostosta MapReduceJoin.tar.gz

Vaihe 3) Siirry hakemistoon MapReduceJoin/

cd MapReduceJoin/

Shell-kehote MapReduceJoin-hakemistoon siirtymisen jälkeen

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.

HDFS- ja YARN-daemon-skriptien käynnistysviestit

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 /

Molemmat syötetiedostot kopioitiin HDFS:n juurihakemistoon

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.

Komentorivi käynnistää pakatun MapReduceJoin-jar-tiedoston

Konsolin lähtö tracseurata MapReduce-liittymistyön edistymistä

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

Liittyneiden osastojen tietueet tulostettiin HDFS:stä cat-komennolla

Tulokset ovat nähtävissä myös verkkokäyttöliittymän kautta mm.

Hadoopin verkkoliittymän aloitussivu, jota käytetään tiedostojärjestelmän selaimeen siirtymiseen

Valitse nyt 'Selaa tiedostojärjestelmää' ja siirry kohtaan /output_mapreducejoin

HDFS-tiedostojärjestelmänäkymän selaaminen output_mapreducejoin-hakemistoon

Avaa osa-r-00000

part-r-00000-tulostiedoston valitseminen selainnäkymässä

Tulokset näytetään

Liittyneen osaston nimi ja osaston vahvuusrivit näkyvät selaimessa

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

  1. 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.
  2. 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.

UKK

Valitse mapper-variantti, kun toinen puoli on tarpeeksi pieni mahtumaan muistiin jokaisessa solmussa, koska se ohittaa sekoituksen kokonaan. Valitse reduktiovariantti, kun molemmat puolet ovat suuria tai lajittelemattomia, ja hyväksy ylimääräiset verkon kustannukset.

Mallit oppivat historiallisesta työhistoriasta ennustaakseen suorituksen kestoa, suositellakseen jakokokoja ja vähennyslaskijoiden määriä sekä havaitakseen laskuriarvojen vinouman. Ne myös merkitsevät työt, joiden vuotaneiden tietueiden tai epäonnistuneiden tehtävien laskurit ajautuvat kyseisen prosessin normaalin kaistan ulkopuolelle.

Copilot tuottaa uskottavia mapper- ja reduktorirakenteita, mutta se sekoittaa vapaasti vanhaa mapred-pakettia uudempaan mapreduce-pakettiin samassa luokassa, mikä ei käänny. Korjaa tuonnit ja metodien allekirjoitukset ennen kuin luotat logiikkaan.

Se on mekanismi, joka lähettää pienemmän tiedoston jokaiselle solmulle ennen tehtävien aloittamista. Jokainen mapperi lataa sitten kopion hajautusmappiin ja etsii osumia paikallisesti, mikä mahdollistaa mapperin puoleisen liitoksen.

Ne tulostuvat konsolin yhteenvetoon työn valmistuttua, näkyvät työhistoriassa ja resurssienhallinnan verkkosivuilla ja ovat luettavissa ohjelmallisesti työobjektista, jotta ajuri voi vaatia niitä ja epäonnistua virheellisessä suorituksessa.

Yksi Context-objekti. Se suorittaa työn, jonka OutputCollector ja Reporter jakoivat keskenään, joten tuloste kirjoitetaan ja laskureita kasvatetaan saman map-metodille annetun kahvan kautta.

Useimmissa raportointitöissä ei. A HiveQL-liittyminen käännetään samaan shuffle-and-merge-malliin muutamalla rivillä. Käsin kirjoitetut työt ovat kannattavia, kun yhdistämislogiikka ei sovi SQL-lausekkeeseen.

Hadoop kieltäytyy kirjoittamasta jo olemassa olevaan tulostushakemistoon, mikä suojaa valmiita tuloksia ylikirjoittamiselta. Poista hakemisto ensin rekursiivisesti tai anna eri tulostuspolku seuraavalla ajokerralla.

Tiivistä tämä viesti seuraavasti: