2016-04-26 16 views
0

In Kürze:Wie kann ich sicherstellen, dass Hadoop v2 denselben Mapper verwendet, um mehrere Blöcke zu verarbeiten?

Ich habe Dateien mit Chunks die gleiche Größe wie die HDFS-Blockgröße, jeder Chunk ist unabhängig, muss aber einem Mapper als Ganzes bereitgestellt werden. Da die Funktion setup meines Mappers viel Zeit in Anspruch nimmt, wie kann ich meine Mapper so konfigurieren, dass mehrere Blöcke/Chunks verarbeitet werden, bevor sie verworfen werden, während gleichzeitig die Datenlokalisierung genutzt wird?

In Long:

Ich versuche Hadoop zu verwenden eine große Anzahl von großen Dateien in großen Brocken zu verarbeiten, etwas, das ist ausgezeichnet Hadoop. Jeder Chunk jeder Eingabedatei kann vollständig getrennt verarbeitet werden, aber jeder Chunk muss als Ganzes genommen werden. Um dies unter Hadoop gut zu machen, habe ich es so gemacht, dass jeder Block genau die Größe des Hadoop-Blocks hat. Ich habe also 'BlockInputFormat' und 'BlockRecordReader' entwickelt, um ganze Blöcke gleichzeitig an den Mapper übergeben zu können. Dies scheint gut zu funktionieren. Das Problem, dem ich gegenüberstehe, ist, dass meine Mapper-Aufgaben (notwendigerweise) eine erhebliche Menge an Arbeit in der setup-Methode zu erledigen haben, und dann wird die 'map'-Funktion nur einmal aufgerufen, bevor das ganze Objekt verworfen wird. Ich habe versucht, die minimale Split-Größe über mapreduce.input.fileinputformat.split.minsize zu erhöhen, die die Anzahl der Setup-Aufrufe reduziert, so dass ich Setup einmal pro Eingabedatei aufrufen (da jede Eingabedatei sowieso in seinem eigenen InputSplit endet). Meine Sorge ist, dass ich dabei den Vorteil der von MapReduce bereitgestellten Datenlokalität verloren hätte, da dies bedeutet, dass InputSplit Blöcke umfasst, die nicht notwendigerweise auf dem Mapper-Rechner liegen.

Zusammengefasst lautet meine Frage: Wie kann ich einen Mapper so konfigurieren, dass er mehrere Blöcke (vielleicht sogar aus verschiedenen Eingabedateien) liest und gleichzeitig die Datenlokalität erhält? Wäre es besser, wenn ich jeden Teil in seine eigene Datei lege?

Vielen Dank für jede Hilfe, die Sie zur Verfügung stellen kann, Phil

Antwort

0
  • Der Mapper wird erhalten basierend auf der Anzahl von Blöcken oder Ihre Eingabe Split zugeordnet.

  • Verwenden Sie CombineFileInputFormat(), um Ihre Eingabedateien in einem einzigen Split zu kombinieren, sodass ein Mapper Ihre Daten verarbeitet.

  • Sie sollten auch die max split size-Eigenschaft festlegen, damit Hadoop die gesamte Eingabe nicht in einen einzigen Split zusammenfasst.

  • Wenn Sie sich mit Nein beschäftigen. von small Dateien dann ist es gut.

    • In diesem Fall müssen Sie CombineFileInputFormat erweitern und die getRecordReader Verfahren nach Rückkehr CombineFileRecordReader zu implementieren.
+0

Hallo Stacey, leider glaube ich nicht, dass dies meine Frage beantwortet.Ich frage nach einer großen Anzahl großer Dateien, und ob ein InputSplit, bei dem es sich um mehrere HDFS-Blöcke handelt, optimiert werden kann, um den Vorteil der Blocklokalität zu nutzen und viele Blöcke für einen einzelnen Mapper bereitzustellen. – Obiphil

0

Verwenden des MultipleInputFomat addInputPath() Methode mit mehreren Eingängen an einen Mapper hinzuzufügen.

MultipleInputs.addInputPath (Job, neuer Pfad (args [0]), TextInputFormat.class, YourMapper.class); MultipleInputs.addInputPath (Job, neuer Pfad (args [1]), TextInputFormat.class, YourMapper.class);