sql >> Databasteknik >  >> RDS >> Database

Förstå MapReduce-typer och -format

Hadoop använder programmeringsmodellen MapReduce för databehandling av in- och utdata för kartan och för att reducera funktioner representerade som nyckel-värdepar. De är föremål för parallell exekvering av datauppsättningar som finns i ett brett utbud av maskiner i en distribuerad arkitektur. Programmeringsparadigmet är i huvudsak funktionellt till sin natur genom att kombinera samtidigt som man använder tekniken att kartlägga och reducera. Den här artikeln introducerar MapReduce-modellen, och i synnerhet hur data i olika format, från enkel text till strukturerade binära objekt används.

MapReduce-typer

Mappning är kärntekniken för att bearbeta en lista med dataelement som kommer i par av nycklar och värden. Kartfunktionen gäller för enskilda element definierade som nyckel-värdepar i en lista och skapar en ny lista. Den allmänna idén om kart- och reduceringsfunktionen hos Hadoop kan illustreras enligt följande:

map: (K1, V1) -> list (K2, V2)
reduce: (K2, list(V2)) -> list (K3, V3)

Ingångsparametrarna för nyckel- och värdeparet, representerade av K1 respektive V1, skiljer sig från utgångspartypen:K2 och V2. Reduceringsfunktionen accepterar samma formatutmatning av kartan, men typen av utdata igen för reduceringsoperationen är annorlunda:K3 och V3. Java API för detta är följande:

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 är det generaliserade gränssnittet för Map-Reduce-ramverket för att underlätta insamling av datautdata antingen av Mapper eller Reducer . Dessa utgångar är inget annat än en mellanprodukt av jobbet. Därför måste de parametriseras med sina typer. Reporter underlättar Map-Reduce-applikationen att rapportera framsteg och uppdatera räknare och statusinformation. Om man däremot använder kombinerarfunktionen har den samma form som reduceringsfunktionen och utmatningen matas till reduceringsfunktionen. Detta kan illustreras enligt följande:

map: (K1, V1) -> list (K2, V2)
combine: (K2, list(V2)) -> list (K2, V2)
reduce: (K2, list(V2)) -> list (K3, V3)

Observera att kombinera och reducera funktionerna använder samma typ, förutom i variabelnamnen där K3 är K2 och V3 är V2.

Partitionsfunktionen fungerar på de mellanliggande nyckel-värdetyperna. Den styr partitioneringen av nycklarna för de mellanliggande kartutgångarna. Nyckeln härleder partitionen med en typisk hashfunktion. Det totala antalet partitioner är detsamma som antalet reduceringsuppgifter för jobbet. Partitionen bestäms endast av att nyckeln ignorerar värdet.

public interface Partitioner<K2, V2> extends JobConfigurable {
   int getPartition(K2 key, V2 value, int numberOfPartition);
}

Detta är kort och gott kärnan i MapReduce-typer.

Inmatningsformat

Hadoop måste acceptera och bearbeta en mängd olika format, från textfiler till databaser. En bit indata, kallad input split , bearbetas av en enda karta. Varje uppdelning är vidare uppdelad i logiska poster som ges till kartan för att bearbeta i nyckel-värdepar. I databassammanhang innebär uppdelningen att man läser ett intervall av tupler från en SQL-tabell, vilket görs av DBInputFormat och producera LongWritables som innehåller postnummer som nycklar och DBWritables som värden. Java API för ingångsdelningar är som följer:

public interface InputSplit extends Writable {
   long getLength() throws IOException;
   String[] getLocations() throws IOException;
}

InputSplit representerar data som ska behandlas av en Mapper . Den returnerar längden i byte och har en referens till indata. Den presenterar en byte-orienterad vy av inmatningen och är RecordReaders ansvar. av jobbet att bearbeta detta och presentera en rekordorienterad syn. I de flesta fall hanterar vi inte InputSplit direkt eftersom de skapas av ett InputFormat . Det är InputFormats ansvar för att skapa indatadelningarna och dela upp 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;
}

JobClient anropar getSplits() metod med lämpligt antal delade argument. Siffran som ges är en ledtråd eftersom det faktiska antalet delningar kan skilja sig från det givna antalet. När fördelningen väl har beräknats skickas den till jobbspåraren. Jobtracker schemalägger kartuppgifter för tasktrackers med hjälp av lagringsplats. Tasktrackern skickar sedan delningen genom att anropa getRecordReader() metod på InputFormat för att få RecordReader för splittringen.

FileInputFormat är basklassen för fildatakällan. Den har ansvaret att identifiera de filer som ska inkluderas som jobbinmatning och definitionen för att generera uppdelningen.

Hadoop inkluderar även bearbetning av ostrukturerad data som ofta kommer i textformat. TextInputFormat är standard InputFormat för sådana uppgifter.

SequenceInputFormat tar upp binära indata och lagrar sekvenser av binära nyckel-värdepar.

På liknande sätt ger DBInputFormat möjlighet att läsa data från relationsdatabas med JDBC.

Utdataformat

Utdataformatklasserna liknar deras motsvarande inmatningsformatklasser och arbetar i motsatt riktning.

Till exempel, TextOutputFormat är standardutdataformatet som skriver poster som vanliga textfiler, medan nyckel-värden kan vara av vilken typ som helst och omvandlar dem till en sträng genom att anropa toString() metod. Nyckel-värde-tecknet separeras av tabb-tecknet, även om detta kan anpassas genom att manipulera separatoregenskapen för textutdataformatet.

För binär utdata finns SequenceFileOutputFormat att skriva en sekvens av binär utdata till en fil. Binära utgångar är särskilt användbara om utdata blir indata till ytterligare ett MapReduce-jobb.

Utdataformaten för relationsdatabaser och till HBase hanteras av DBoutputFormat . Den skickar den reducerade utdata till en SQL-tabell. Till exempel HBases TableOutputFormat gör det möjligt för MapReduce-programmet att arbeta med data som lagras i HBase-tabellen och använder den för att skriva utdata till HBase-tabellen.

Slutsats

Detta är kort och gott kärnan i MapReduce-typer och -format. Se listan i referensen nedan för att få mer information om dem. Det finns många intrikata detaljer om funktionerna hos Java API:er som blir tydligare först när man dyker in i programmering. Se Apache Hadoop Java API-dokumentation för mer information och börja koda några metoder.

Referenser

  • Tom White, Hadoop The Definitive Guide , O’Reilly
  • Apache Hadoop Java API Docs

  1. Hur man konfigurerar Databas Mail i SQL Server

  2. Hur man skapar en databas i SQL Server

  3. SQL-fel:ORA-01861:literal matchar inte formatsträngen 01861

  4. Hur man hanterar PDO-undantag