Hadoop MapReduce Bli med og telle med eksempel

⚡ Smart oppsummering

MapReduce-koblinger kombinerer to store datasett på en delt nøkkel, enten inne i mapperen eller inne i reduksjonsverktøyet, mens MapReduce-tellere samler inn statistikk om jobben slik at dårlige poster kan måles i stedet for å gjettes.

  • 🔘 Grunnleggende om å bli med: Det minste av de to datasettene distribueres til hver datanode og brukes som oppslagsside.
  • ☑️ Kartsidekobling: Krever at hver inndata partisjoneres, deles likt og sorteres etter sammenkoblingsnøkkelen før kartleggingsfunksjonen kjøres.
  • Reduser-side kobling: Trenger ingen partisjonering, fordi hver tuple som deler en join-nøkkel lander i samme reduseringsverktøy.
  • 🧪 Utarbeidet eksempel: DeptName.txt og DeptStrength.txt kopieres til HDFS og kobles sammen på Dept_ID av en pakket jar-fil.
  • 🛠️ Tellertyper: Fem innebygde tellergrupper følger med hver jobb, og brukerdefinerte tellere deklareres som en Java opptelling.
  • ⚠️ Bruk av teller: Å øke en teller for hver manglende eller ugyldig post gjør datakvalitetsproblemer om til et tall på jobbrapporten.

Hadoop MapReduce-veiledning for sammenføyning og teller med et praktisert eksempel

Hva er Join i MapReduce?

MapReduce Join-operasjonen brukes til å kombinere to store datasett. Denne prosessen innebærer imidlertid å skrive mye kode for å utføre selve sammenkoblingsoperasjonen. Sammenkobling av to datasett starter med å sammenligne størrelsen på hvert datasett. Hvis ett datasett er mindre sammenlignet med det andre datasettet, distribueres det mindre datasettet til hver datanode i klyngen.

Når man først blir med MapReduce er distribuert, bruker enten Mapper eller Reducer det mindre datasettet til å utføre et oppslag etter samsvarende poster fra det store datasettet, og kombinerer deretter disse postene for å danne utdataposter.

Typer bli med

Avhengig av stedet der den faktiske sammenføyningen utføres, klassifiseres sammenføyninger i Hadoop i to typer.

  1. Kartsidekobling — Når sammenføyningen utføres av mapperen, kalles det en kartside-sammenføyning. I denne typen utføres sammenføyningen før data faktisk forbrukes av kartfunksjonen. Det er obligatorisk at inputen til hvert kart er i form av en partisjon og er i sortert rekkefølge. Det må også være et likt antall partisjoner, og det må sorteres etter sammenføyningsnøkkelen.
  2. Reduser sidekobling — Når sammenføyningen utføres av reduseringsfunksjonen, kalles det en reduseringssidesammenføyning. Det er ikke nødvendig i denne sammenføyningen å ha et datasett i en strukturert form (eller partisjonert). Her sender kartsidebehandling ut sammenføyningsnøkkelen og de tilsvarende tuplene for begge tabellene. Som en effekt av denne behandlingen faller alle tuplene med samme sammenføyningsnøkkel inn i samme reduseringsfunksjon, som deretter sammenføyer postene med samme sammenføyningsnøkkel.

En samlet prosessflyt av sammenføyninger i Hadoop er avbildet i diagrammet nedenfor.

Prosessflytdiagram som sammenligner en kartsidekobling med en reduksjonssidekobling i Hadoop
Typer sammenføyninger i Hadoop MapReduce

Når de to variantene er klare, går neste avsnitt gjennom en reduce-side join på to små avdelingsfiler.

Slik kobler du sammen to datasett: MapReduce Eksempel

Det er to datasett i to forskjellige filer (vist nedenfor). Nøkkelen Dept_ID er felles i begge filene. Målet er å bruke MapReduce Join til å kombinere disse filene.

Første inndatafil som viser avdelings-ID-er ved siden av avdelingsnavn

1 File
Andre inndatafil som viser avdelings-ID-er sammen med avdelingsstyrkeverdier

2 File

Inngang: Inndatasettet er en txt-fil, DeptName.txt og DeptStrength.txt

Last ned inndatafiler herfra

Forsikre deg om at du har det Hadoop installert. Før du starter med den faktiske prosessen i MapReduce Join-eksemplet, endrer du brukeren til 'hduser' (ID-en som ble brukt under Hadoop-konfigurasjonen. Du kan bytte til bruker-ID-en som ble brukt under Hadoop-konfigurasjonen).

su - hduser_

Ledeteksten endres til Hadoop-kontoen, som vist nedenfor.

Terminal etter å ha byttet til hduser-kontoen med su-kommandoen

Trinn 1) Kopier zip-filen til stedet du ønsker

Nedlastet MapReduceJoin-arkiv plassert i den valgte arbeidsmappen

Trinn 2) Pakk ut zip-filen

sudo tar -xvf MapReduceJoin.tar.gz

Eksentracted-filnavn ruller forbi mens tar pakker ut arkivet.

Konsollliste over filer f.eks.trachentet fra MapReduceJoin.tar.gz

Trinn 3) Gå til katalogen MapReduceJoin/

cd MapReduceJoin/

Shell-ledetekst etter å ha endret til MapReduceJoin-katalogen

Trinn 4) Start Hadoop

$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh

Begge skriptene skriver ut daemonene de åpner.

Oppstartsmeldinger fra HDFS- og YARN-daemonskriptene

Trinn 5) DeptStrength.txt og DeptName.txt er inndatafilene som brukes for dette MapReduce Join-eksempelprogrammet.

Disse filene må kopieres til HDFS ved å bruke kommandoen nedenfor-

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal DeptStrength.txt DeptName.txt /

Begge inndatatekstfilene kopiert til HDFS-rotkatalogen

Trinn 6) Kjør programmet ved å bruke kommandoen nedenfor-

$HADOOP_HOME/bin/hadoop jar MapReduceJoin.jar MapReduceJoin/JoinDriver/DeptStrength.txt /DeptName.txt /output_mapreducejoin

Kommandoen gjentas først, og jobben rapporterer deretter fremdriften i konsollen.

Kommandolinje som starter den pakkede MapReduceJoin jar-filen

Konsollutgang tracovervåke fremdriften til MapReduce-sammenkoblingsjobben

Trinn 7) Etter utførelse lagres utdatafilen (med navnet 'part-00000') i katalogen /output_mapreducejoin på HDFS.

Resultatene kan sees ved hjelp av kommandolinjegrensesnittet

$HADOOP_HOME/bin/hdfs dfs -cat /output_mapreducejoin/part-00000

Registreringer for sluttede avdelinger skrevet ut fra HDFS med cat-kommandoen

Resultatene kan også sees via et nettgrensesnitt som-

Hadoop-nettgrensesnittets landingsside som brukes for å nå filsystemleseren

Velg nå «Bla gjennom filsystemet» og naviger opp til /output_mapreducejoin

Blar gjennom HDFS-filsystemvisningen til output_mapreducejoin-katalogen

Åpen del-r-00000

Velge utdatafilen part-r-00000 i nettleservisningen

Resultatene vises

Sammenslåtte rader for avdelingsnavn og avdelingsstyrke vises i nettleseren

NOTAT: Vær oppmerksom på at før du kjører dette programmet for neste gang, må du slette utdatakatalogen /output_mapreducejoin

$HADOOP_HOME/bin/hdfs dfs -rm -r /output_mapreducejoin

Alternativet er å bruke et annet navn for utdatakatalogen.

Sammenføyninger forteller deg hvordan dataene ser ut. Tellere, som dekkes senere, forteller deg hvordan jobben som produserte dem oppførte seg.

Hva er Counter i MapReduce?

En teller i MapReduce er en mekanisme som brukes til å samle inn og måle statistisk informasjon om MapReduce-jobber og -hendelser. Tellere holder track av ulike jobbstatistikker i MapReduce, som antall operasjoner som har blitt utført og fremdriften til operasjonen. Tellere brukes til problemdiagnose i MapReduce.

Hadoop-tellere ligner på å sette en loggmelding i koden for et kart eller redusere. Denne informasjonen kan være nyttig for diagnostisering av et problem i MapReduce jobbbehandling.

Vanligvis er disse tellerne i Hadoop definert i et program (tilordnes eller reduseres) og økes under utførelse når en bestemt hendelse eller betingelse (spesifikk for den telleren) oppstår. En veldig god anvendelse av Hadoop-tellere er å track gyldige og ugyldige poster fra et inputdatasett.

Typer MapReduce-tellere

Det finnes i utgangspunktet to typer MapReduce-tellere.

  1. Innebygde tellere i Hadoop: Det er noen innebygde Hadoop-tellere som eksisterer per jobb. Nedenfor er innebygde tellergrupper-
    • MapReduce Task Counters — Samler inn oppgavespesifikk informasjon (f.eks. antall inndataposter) i løpet av utførelsestiden.
    • Filsystemtellere — Samler inn informasjon som antall byte lest eller skrevet av en oppgave.
    • FileInputFormat-tellere — Samler informasjon om et antall byte lest gjennom FileInputFormat.
    • FileOutputFormat-tellere — Samler informasjon om et antall byte skrevet gjennom FileOutputFormat.
    • Jobbtellere — Disse tellerne registrerer statistikk for hele jobben, for eksempel antall oppgaver som er startet for en jobb.
  2. Brukerdefinerte tellere: I tillegg til innebygde tellere kan en bruker definere sine egne tellere ved hjelp av lignende funksjoner som tilbys av programmeringsspråk. For eksempel, i Java, en 'enum' brukes til å definere brukerdefinerte tellere.

💡 Versjonsmerknad: jobbtellere ble vedlikeholdt av jobbenTracker under MRv1. På YARN tilhører den rollen MapReduce ApplicationMaster, så tellernavnene beholder sin status, men komponenten som rapporterer dem har endret seg.

En jobb kan ikke deklarere et ubegrenset antall tellere. mapreduce.job.counters.max innstillingen setter en standardgrense på 120 per jobb, og en jobb som deklarerer flere mislykkes med en LimitExceededException, så tellere er ment for en håndfull aggregerte signaler i stedet for tellinger per nøkkel.

Eksempel på tellere

Et eksempel på en MapClass med tellere for å telle antall manglende og ugyldige verdier. Inndatafil brukt i denne veiledningen Inndatasettet vårt er en CSV-fil, 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"));
        }
    }
}

Kodestykket ovenfor viser et eksempel på implementering av tellere i Hadoop MapReduce.

Her Salgstellere er en teller definert ved hjelp av 'enum'. Den brukes til å telle MANGLENDE og UGYLDIGE inndataposter.

I kodebiten, hvis 'land'-feltet har lengde null, mangler verdien, og dermed økes den tilsvarende telleren SalesCounters.MISSING.

Neste, hvis 'salg'-feltet starter med et «, regnes posten som UGYLDIG. Dette indikeres ved å øke telleren SalesCounters.INVALID.

💡 API-merknad: utdraget ovenfor bruker originalen org.apache.hadoop.mapred API, hvor MapReduceBaseden Mapper grensesnitt, OutputCollector og Reporter vises separat. Gjeldende kode er skrevet mot org.apache.hadoop.mapreduce, hvor en enkelt Context erstatter samleren og rapportøren, og en teller økes med context.getCounter(SalesCounters.MISSING).increment(1)Tellerkonseptet er identisk i begge.

Spørsmål og svar

Velg mapper-varianten når én side er liten nok til å holde i minnet på hver node, fordi den hopper over shufflingen fullstendig. Velg reduksjonsvarianten når begge sider er store eller usorterte, og aksepter den ekstra nettverkskostnaden.

Modeller lærer fra historisk jobbhistorikk for å forutsi kjøretid, anbefale delte størrelser og reduksjonsantall, og oppdage skjevhet fra tellerverdier. De flagger også jobber der tellere for sølte poster eller mislykkede oppgaver avviker utenfor det normale båndet for den aktuelle pipelinen.

Copilot produserer plausible mapper- og reducer-skjeletter, men den blander fritt den gamle mapred-pakken med den nyere mapreduce-pakken i én klasse, som ikke vil kompilere. Rett importene og metodesignaturene før du stoler på logikken.

Det er mekanismen som sender den mindre filen til hver node før oppgavene starter. Hver mapper laster deretter inn den kopien i et hash-kart og slår opp treff lokalt, noe som gjør en mapper-side join mulig.

De skrives ut i konsollsammendraget når jobben er fullført, vises i jobbhistorikken og ressursbehandlingens nettsider, og kan leses programmatisk fra jobbobjektet, slik at en driver kan gjøre krav på dem og mislykkes med en feilkjøring.

Et enkelt kontekstobjekt. Det bærer arbeidet som OutputCollector og Reporter brukte til å dele mellom seg, slik at utdata skrives og tellere økes gjennom samme referanse som sendes inn i kartmetoden.

For det meste av rapporteringsarbeidet, nei. A HiveQL-medlemskap kompilerer ned til samme omstokkings-og-flettingsmønster på noen få linjer. Håndskrevne jobber er verdt det når flettelogikken ikke passer til en SQL-klausul.

Hadoop nekter å skrive inn i en utdatamappe som allerede finnes, noe som beskytter ferdige resultater fra å bli overskrevet. Slett mappen rekursivt først, eller send en annen utdatasti ved neste kjøring.

Oppsummer dette innlegget med: