it-swarm.com.de

Wie führt Hadoop Eingangssplits durch?

Dies ist eine konzeptionelle Frage, die Hadoop/HDFS beinhaltet. Nehmen wir an, Sie haben eine Datei mit einer Milliarde Zeilen. Der Einfachheit halber sei angenommen, dass jede Zeile die Form <k,v> hat, wobei k der Versatz der Zeile vom Anfang und der Wert der Inhalt der Zeile ist. 

Wenn wir nun sagen, dass wir N Map-Aufgaben ausführen möchten, teilt das Framework die Eingabedatei in N-Splits auf und führt jede Map-Task für diesen Split aus? oder müssen wir eine Partitionierungsfunktion schreiben, die die N-Splits ausführt und jede Map-Task mit dem generierten Split ausführt? 

Ich möchte nur wissen, ob die Aufteilungen intern erfolgen oder müssen wir die Daten manuell aufteilen?

Genauer gesagt, wenn die map () - Funktion aufgerufen wird, wie lauten ihre Key key and Value val-Parameter?

Danke, Deepak 

34
Deepak

Die InputFormat ist für die Bereitstellung der Splits verantwortlich.

Wenn Sie über n Knoten verfügen, wird die Datei im Allgemeinen über alle diese n Knoten verteilt. Wenn Sie einen Job starten, gibt es standardmäßig n Mapper. Dank Hadoop verarbeitet der Mapper auf einer Maschine den Teil der Daten, die auf diesem Knoten gespeichert sind. Ich denke, das heißt Rack awareness.

Um es kurz zu machen: Laden Sie die Daten in das HDFS hoch und starten Sie einen MR-Job. Hadoop kümmert sich um die optimierte Ausführung.

23

Dateien werden in HDFS-Blöcke aufgeteilt und die Blöcke werden repliziert. Hadoop weist einen Knoten für einen Split nach dem Prinzip der Datenlokalität zu. Hadoop versucht, den Mapper auf den Knoten auszuführen, auf denen sich der Block befindet. Aufgrund der Replikation gibt es mehrere solcher Knoten, die denselben Block enthalten. 

Falls die Knoten nicht verfügbar sind, versucht Hadoop, einen Knoten auszuwählen, der dem Knoten, der den Datenblock hostet, am nächsten liegt. Es könnte beispielsweise ein anderer Knoten im selben Rack ausgewählt werden. Ein Knoten ist möglicherweise aus verschiedenen Gründen nicht verfügbar. Alle Kartensteckplätze können verwendet werden oder der Knoten ist einfach inaktiv.

14
Pranab

Glücklicherweise wird alles durch Rahmenbedingungen erledigt. 

Die Datenverarbeitung von MapReduce wird durch dieses Konzept von input splits gesteuert. Die Anzahl der für eine bestimmte Anwendung berechneten Eingabe-Splits bestimmt die Anzahl der Mapper-Tasks.

Die Anzahl der Zuordnungen wird normalerweise von der Anzahl der DFS-Blöcke in den Eingabedateien bestimmt. 

Jede dieser Mapper-Tasks wird, wo möglich, einem Slave-Knoten zugewiesen, auf dem die Eingangsaufteilung gespeichert ist. Der Ressourcenmanager (oder JobTracker, wenn Sie sich in Hadoop 1 befinden) unternimmt alles, um sicherzustellen, dass Eingabe-Splits lokal verarbeitet werden.

Wenn Datenort nicht erreicht werden kann, weil Eingangssplits die Grenzen von Datenknoten überschreiten, werden einige Daten von einem Datenknoten zu einem anderen Datenknoten übertragen.

Angenommen, es gibt einen Block mit 128 MB, und der letzte Datensatz passte nicht in Block a und breitet sich in Block b aus. Dann werden Daten in Block b in den Knoten kopiert Block a haben

Schauen Sie sich dieses Diagramm an.

 enter image description here

Schauen Sie sich verwandte Fragen an

Über Hadoop/HDFS-Dateisplitting

Wie werden Hadoop-Prozessdatensätze über Blockgrenzen verteilt?

8
Ravindra babu

Für ein besseres Verständnis der Funktionsweise von InputSplits in hadoop würde ich empfehlen, den Artikel zu lesen, der von hadoop für Dummies geschrieben wurde. Es ist wirklich hilfreich.

6
Matthias Kricke

Ich denke, bei Deepak ging es mehr darum, wie die Eingabe für jeden call der Kartenfunktion bestimmt wird, als die Daten, die auf jeder Karte node vorhanden sind. Ich sage dies basierend auf dem zweiten Teil der Frage: Genauer gesagt, jedes Mal, wenn die map () - Funktion aufgerufen wird, wie lauten die Schlüsselparameter Key und Value val?

Tatsächlich brachte mich dieselbe Frage hierher, und wenn ich ein erfahrener Hadoop-Entwickler gewesen wäre, hätte ich sie vielleicht wie die obigen Antworten interpretiert.

Um die Frage zu beantworten,

die Datei an einem bestimmten Map-Knoten wird auf der Grundlage des für InputFormat festgelegten Werts aufgeteilt. (dies erfolgt in Java mit setInputFormat () !)

Ein Beispiel:

conf.setInputFormat (TextInputFormat.class); Hier übergeben wir hadoop, indem Sie TextInputFormat an die Funktion setInputFormat übergeben, jede line der Eingabedatei am Kartenknoten als Eingabe für die Kartenfunktion zu behandeln. Zeilenvorschub oder Wagenrücklauf signalisieren das Zeilenende . Weitere Informationen unter TextInputFormat !

In diesem Beispiel: Schlüssel sind die Position in der Datei und Werte die Textzeile.

Hoffe das hilft.

4
Karishma Malkan

Wenn ein Hadoop-Job ausgeführt wird, werden die Eingabedateien in Blöcke aufgeteilt und jeder Teilung einem Mapper zur Verarbeitung zugewiesen. Dies wird als InputSplit bezeichnet.

1

FileInputFormat ist die abstrakte Klasse, die definiert, wie die Eingabedateien gelesen und aufgeschüttet werden. 1. Wählen Sie Dateien/Objekte aus, die als Eingabe verwendet werden sollen 2. Definiert Inputsplits, die eine Datei in eine Aufgabe aufteilen.

Gemäß der grundlegenden Funktionalität von hadoopp gibt es n Mapper, wenn es n Splits gibt.

1
shashikant

Unterschied zwischen Blockgröße und Eingangssplitgröße.

Input Split ist eine logische Aufteilung Ihrer Daten, die hauptsächlich bei der Datenverarbeitung in MapReduce oder anderen Verarbeitungstechniken verwendet wird. Die Eingabeaufteilungsgröße ist ein benutzerdefinierter Wert, und Hadoop Developer kann die Aufteilungsgröße basierend auf der Datengröße auswählen (Anzahl der Daten, die Sie verarbeiten).

Input Split wird im Wesentlichen zur Steuerung der Mappered-Nummer in MapReduce verwendet. Wenn Sie im MapReduce-Programm keine Eingabesplitgröße definiert haben, wird die Standardaufteilung des HDFS-Blocks während der Datenverarbeitung als Eingabesplit betrachtet.

Beispiel:

Angenommen, Sie haben eine Datei mit 100 MB und die HDFS-Standardblockkonfiguration ist 64 MB, dann wird sie in zwei Teile aufgeteilt und belegt zwei HDFS-Blöcke. Jetzt haben Sie ein MapReduce-Programm, um diese Daten zu verarbeiten. Sie haben jedoch keinen Eingabesplit angegeben. Dann wird die Anzahl der Blöcke (2 Blöcke) als Eingabesplit für die MapReduce-Verarbeitung betrachtet und zwei Mapper werden für diesen Job zugewiesen. Angenommen, Sie haben die Aufteilungsgröße (z. B. 100 MB) in Ihrem MapReduce-Programm angegeben. Dann werden beide Blöcke (2 Blöcke) als einzelne Aufteilung für die MapReduce-Verarbeitung betrachtet, und ein Mapper wird für diesen Job zugewiesen.

Nehmen Sie nun an, Sie haben die Aufteilungsgröße (zB 25 MB) in Ihrem MapReduce-Programm angegeben. Dann werden 4 Aufteilung für das MapReduce-Programm vorgenommen und 4 Mapper werden für den Job zugewiesen.

Fazit:

  1. Input Split ist eine logische Aufteilung der Eingangsdaten, während der HDFS-Block eine physikalische Aufteilung von Daten ist.
  2. Die HDFS-Standardblockgröße ist eine Standardaufteilungsgröße, wenn der Eingangssplit nicht über Code angegeben wird.
  3. Split ist benutzerdefiniert und der Benutzer kann die Splitgröße in MapReduce steuern.
  4. Eine Aufteilung kann auf mehrere Blöcke abgebildet werden, und es kann mehrere Aufteilungen von einem Block geben.
  5. Die Anzahl der Map-Tasks (Mapper) entspricht der Anzahl der Eingabeaufteilungen.

Quelle: https://hadoopjournal.wordpress.com/2015/06/30/mapreduce-input-split-versus-hdfs-blocks/

1
Nikhil Redij

Die kurze Antwort lautet: InputFormat kümmert sich um die Aufteilung der Datei. 

Ich gehe diese Frage an, indem ich mir die Standard-Klasse TextInputFormat ansehe:

Alle InputFormat-Klassen sind Unterklassen von FileInputFormat, die sich um die Aufteilung kümmern.

Die Funktion getSplit von FileInputFormat generiert eine Liste von InputSplit aus der in JobContext definierten Liste der Dateien. Die Aufteilung basiert auf der Größe von Bytes, deren Min und Max in der Projekt-XML-Datei willkürlich definiert werden können.

0
Allen Lin

Es gibt einen separaten Map-Reduction-Job, der die Dateien in Blöcke aufteilt. Verwenden Sie FileInputFormat für große Dateien und das CombineFileInput-Format für kleinere Dateien. Sie können auch überprüfen, ob die Eingabe nach der Methode issplittable in Blöcke aufgeteilt werden kann. Jeder Block wird dann einem Datenknoten zugeführt, wo ein Map-Reduction-Job zur weiteren Analyse ausgeführt wird. Die Größe eines Blocks hängt von der Größe ab, die Sie im Parameter mapred.max.split.size angegeben haben.

0
Pallavi Gupta

FileInputFormat.addInputPath (job, neuer Pfad (args [0])); oder

conf.setInputFormat (TextInputFormat.class); 

class FileInputFormat funcation addInputPath , setInputFormat Achten Sie auf das Inputsplit. Dieser Code definiert auch die Anzahl der erstellten Mapper. Es kann gesagt werden, dass inputplit und die Anzahl der Mapper direkt proportional zur Anzahl der Blöcke ist, die zum Speichern der Eingabedatei auf HDFS verwendet werden.

Ex. Wenn wir eine Eingabedatei mit einer Größe von 74 MB haben, wird diese Datei in zwei Blöcken (64 MB und 10 MB) auf HDFS gespeichert. Es gibt also zwei Einträge für diese Datei, und es werden zwei Mapper-Instanzen zum Lesen dieser Eingabedatei erstellt.

0