Hadoop bruger MapReduce-programmeringsmodellen til databehandling af input og output til kortet og til at reducere funktioner repræsenteret som nøgleværdi-par. De er underlagt parallel eksekvering af datasæt placeret i en bred vifte af maskiner i en distribueret arkitektur. Programmeringsparadigmet er i det væsentlige funktionelt i sin natur ved at kombinere, mens man bruger teknikken til at kortlægge og reducere. Denne artikel introducerer MapReduce-modellen, og især hvordan data i forskellige formater, fra simpel tekst til strukturerede binære objekter, bruges.
MapReduce-typer
Kortlægning er kerneteknikken til at behandle en liste over dataelementer, der kommer i par af nøgler og værdier. Kortfunktionen gælder for individuelle elementer, der er defineret som nøgleværdi-par på en liste og producerer en ny liste. Den generelle idé om kort og reducere funktion af Hadoop kan illustreres som følger:
map: (K1, V1) -> list (K2, V2) reduce: (K2, list(V2)) -> list (K3, V3)
Indgangsparametrene for nøgle- og værdiparret, repræsenteret ved henholdsvis K1 og V1, er forskellige fra outputpartypen:K2 og V2. Reduceringsfunktionen accepterer det samme format som output fra kortet, men outputtypen igen for reduktionsoperationen er anderledes:K3 og V3. Java API'en til dette er som følger:
public interface Mapper<K1, V1, K2, V2> extends JobConfigurable, Closeable { void map(K1 key, V1 value, OutputCollector<K2, V2> output, Reporter reporter) throws IOException; } public interface Reducer<K2, V2, K3, V3> extends JobConfigurable, Closeable { void reduce(K2 key, Iterator<V2> values, OutputCollector<K3, V3> output, Reporter reporter)throws IOException; }
OutputCollector er den generaliserede grænseflade af Map-Reduce-rammen for at lette indsamling af dataoutput enten af Mapper eller Reducer . Disse output er intet andet end et mellemprodukt af jobbet. Derfor skal de parametriseres med deres typer. Reporteren letter Map-Reduce-applikationen til at rapportere fremskridt og opdatere tællere og statusoplysninger. Hvis der imidlertid anvendes mejetærskerfunktionen, har den samme form som reduktionsfunktionen, og outputtet føres til reduktionsfunktionen. Dette kan illustreres som følger:
map: (K1, V1) -> list (K2, V2) combine: (K2, list(V2)) -> list (K2, V2) reduce: (K2, list(V2)) -> list (K3, V3)
Bemærk, at kombinere og reducere funktionerne bruger samme type, undtagen i variabelnavnene, hvor K3 er K2 og V3 er V2.
Partitionsfunktionen fungerer på de mellemliggende nøgleværdityper. Det styrer partitioneringen af nøglerne til de mellemliggende kortudgange. Nøglen udleder partitionen ved hjælp af en typisk hash-funktion. Det samlede antal partitioner er det samme som antallet af reduktionsopgaver for jobbet. Partitionen bestemmes kun af nøglen, der ignorerer værdien.
public interface Partitioner<K2, V2> extends JobConfigurable { int getPartition(K2 key, V2 value, int numberOfPartition); }
Dette er kort fortalt nøgleessensen af MapReduce-typer.
Inputformater
Hadoop skal acceptere og behandle en række forskellige formater, fra tekstfiler til databaser. En del input, kaldet input split , behandles af et enkelt kort. Hver opdeling er yderligere opdelt i logiske poster givet til kortet for at behandle i nøgleværdi-par. I forbindelse med database betyder opdelingen læsning af en række tuples fra en SQL-tabel, som udført af DBInputFormat og producere LongWritables indeholdende postnumre som nøgler og DBWritables som værdier. Java API'et til inputopdelinger er som følger:
public interface InputSplit extends Writable { long getLength() throws IOException; String[] getLocations() throws IOException; }
InputSplit repræsenterer de data, der skal behandles af en Mapper . Den returnerer længden i bytes og har en reference til inputdataene. Den præsenterer en byte-orienteret visning af input og er RecordReaders ansvar. af jobbet til at bearbejde dette og præsentere et rekordorienteret syn. I de fleste tilfælde beskæftiger vi os ikke med InputSplit direkte fordi de er skabt af et InputFormat . Det er InputFormats ansvar at oprette input-opdelingerne og opdele dem i poster.
public interface InputFormat<K, V> { InputSplit[] getSplits(JobConf job, int numSplits) throws IOException; RecordReader<K, V> getRecordReader(InputSplit split, JobConf job, throws IOException; }
JobClienten kalder getSplits() metode med passende antal opdelte argumenter. Det angivne tal er et hint, da det faktiske antal opdelinger kan være forskelligt fra det givne antal. Når opdelingen er beregnet, sendes den til jobtrackeren. Jobtrackeren planlægger kortopgaver for tasktrackerne ved hjælp af lagerplacering. Tasktrackeren videregiver derefter opdelingen ved at kalde getRecordReader() metode på InputFormat for at få RecordReader for opdelingen.
FileInputFormat er basisklassen for fildatakilden. Det har ansvaret for at identificere de filer, der skal inkluderes som jobinput og definitionen for generering af opdelingen.
Hadoop omfatter også behandling af ustrukturerede data, der ofte kommer i tekstformat. TextInputFormat er standard InputFormat for sådanne data.
SequenceInputFormat optager binære input og gemmer sekvenser af binære nøgle-værdi-par.
På samme måde giver DBInputFormat mulighed for at læse data fra relationsdatabase ved hjælp af JDBC.
Outputformater
Outputformatklasserne ligner deres tilsvarende inputformatklasser og arbejder i den modsatte retning.
For eksempel TextOutputFormat er standardoutputformatet, der skriver poster som almindelige tekstfiler, hvorimod nøgleværdier kan være af enhver type og transformerer dem til en streng ved at kalde toString() metode. Nøgleværditegnet er adskilt af tabulatortegnet, selvom dette kan tilpasses ved at manipulere separatoregenskaben for tekstoutputformatet.
Til binært output er der SequenceFileOutputFormat at skrive en sekvens af binært output til en fil. Binære output er særligt nyttige, hvis outputtet bliver input til et yderligere MapReduce-job.
Outputformaterne for relationsdatabaser og til HBase håndteres af DBoutputFormat . Det sender det reducerede output til en SQL-tabel. For eksempel HBases TableOutputFormat gør det muligt for MapReduce-programmet at arbejde på de data, der er gemt i HBase-tabellen og bruger det til at skrive output til HBase-tabellen.
Konklusion
Dette er kort sagt kernen i MapReduce-typer og -formater. Se listen i referencen nedenfor for at få flere detaljer om dem. Der er mange indviklede detaljer om funktionerne i Java API'erne, der kun bliver tydeligere, når man dykker ned i programmering. Se Apache Hadoop Java API-dokumenterne for flere detaljer og begynd at kode nogle praksisser.
Referencer
- Tom White, Hadoop The Definitive Guide , O'Reilly
- Apache Hadoop Java API Docs