it-swarm.com.de

Splitgröße vs. Blockgröße in Hadoop

Welcher Zusammenhang besteht zwischen Aufteilungsgröße und Blockgröße in Hadoop? Wenn ich in this lese, muss die Split-Größe n-fach der Blockgröße sein (n ist eine ganze Zahl und n> 0), stimmt das? Gibt es ein notwendiges Verhältnis zwischen Splitgröße und Blockgröße?

13
duong_dajgja

In der HDFS-Architektur gibt es ein Konzept von Blöcken. Eine typische von HDFS verwendete Blockgröße beträgt 64 MB. Wenn wir eine große Datei in HDFS platzieren, wird diese in 64 MB große Blöcke aufgeteilt (basierend auf der Standardkonfiguration der Blöcke). Angenommen, Sie haben eine Datei mit 1 GB, und Sie möchten diese Datei in HDFS platzieren, dann werden 1 GB/64 MB = 16 Split/Blöcke, und diese Blöcke werden auf die DataNodes verteilt. Diese Blöcke/Blöcke befinden sich je nach Cluster-Konfiguration auf einem anderen DataNode.

Die Aufteilung der Daten erfolgt auf der Grundlage von Dateiverschiebungen. Das Ziel, Dateien zu teilen und in verschiedene Blöcke zu speichern, ist die parallele Verarbeitung und das Failover von Daten. 

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

Die Aufteilung ist eine logische Aufteilung der Daten, die im Wesentlichen während der Datenverarbeitung mit dem Map/Reduce-Programm oder anderen Datenverarbeitungstechniken im Hadoop Ecosystem verwendet wird. Die Aufteilungsgröße ist ein vom Benutzer definierter Wert. Sie können Ihre Aufteilungsgröße basierend auf Ihrem Datenvolumen auswählen (Anzahl der Daten, die Sie verarbeiten).

Split wird im Wesentlichen verwendet, um die Anzahl der Mapper im Map/Reduce-Programm zu steuern. Wenn Sie in Map/Reduce-Programm keine Eingabesplitgröße definiert haben, wird die Standardaufteilung des HDFS-Blocks 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 zerhackt und belegt 2 Blöcke. Jetzt haben Sie ein Map/Reduce-Programm, um diese Daten zu verarbeiten. Sie haben jedoch keinen Eingangssplit angegeben, der auf der Anzahl der Blöcke (2 Blöcke) basiert. Der Eingangssplit wird für die Map/Reduce-Verarbeitung berücksichtigt, und 2 Mapper werden dafür zugewiesen Job.

Angenommen, Sie haben die Aufteilungsgröße (z. B. 100 MB) in Ihrem Map/Reduce-Programm angegeben. Dann werden beide Blöcke (2 Blöcke) als einzelne Aufteilung für die Map/Reduce-Verarbeitung betrachtet und 1 Mapper wird für diesen Job zugewiesen.

Angenommen, Sie haben die Aufteilungsgröße (z. B. 25 MB) in Ihrem Map/Reduce-Programm angegeben. Dann werden 4 Aufteilungen für das Map/Reduce-Programm erstellt und 4 Mapper werden für den Job zugewiesen.

Fazit:

  1. Split ist eine logische Division der Eingabedaten, während ein Block eine physikalische Division von Daten ist.
  2. Die HDFS-Standardblockgröße ist die Standardaufteilungsgröße, wenn keine Eingangsaufteilung angegeben ist.
  3. Split ist benutzerdefiniert und der Benutzer kann die Split-Größe in seinem Map/Reduce-Programm 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 Splits.
54
Sandeep Singh
  • Angenommen, wir haben eine Datei mit 400MB mit bestehend aus 4 Datensätzen (z. B.: csv-Datei mit 400 MB und 4 Zeilen mit jeweils 100 MB.

 enter image description here

  • Wenn das HDFS Blockgröße als 128 MB konfiguriert ist, werden die 4 Datensätze nicht gleichmäßig auf die Blöcke verteilt. Es wird so aussehen.

 enter image description here

  • Block 1 enthält den gesamten ersten Datensatz und einen 28-MB-Block des zweiten Datensatzes.
  • Wenn ein Mapper auf Block 1 ausgeführt werden soll, kann der Mapper nicht verarbeitet werden, da er nicht den gesamten zweiten Datensatz enthält. 

  • Dies ist das genaue Problem, das Eingangssplits löst. Eingangssplits respektiert die Grenzen logischer Datensätze.

  • Nehmen wir an, die Eingabesplit Größe ist 200MB

 enter image description here

  • Daher sollte Eingangssplit 1 sowohl Datensatz 1 als auch Datensatz 2 haben. Und Eingangssplit 2 beginnt nicht mit Datensatz 2, da Datensatz 2 Eingangssplit 1 zugewiesen wurde. Eingangssplit 2 beginnt mit Datensatz 3.

  • Aus diesem Grund ist ein Eingabesplit nur ein logischer Chunk von Daten. Es zeigt an, dass Standorte mit Blöcken beginnen und enden.

  • Wenn die Eingabesplitgröße das N-fache der Blockgröße ist, könnte ein Eingabesplit für mehrere Blöcke passen und daher weniger Mappers für den gesamten Job und somit weniger Parallelität erforderlich sein. (Anzahl der Mapper ist die Anzahl der Eingangssplits.)

  • Eingangsteilungsgröße = Blockgröße ist die ideale Konfiguration.

Hoffe das hilft.

11
tharindu_DG

Die Split-Erstellung hängt von dem verwendeten InputFormat ab. Das folgende Diagramm erläutert, wie die Methode getSplits () von FileInputFormat die Aufteilung für zwei verschiedene Dateien festlegt.
Beachten Sie die Rolle der Split Slope (1.1).
 enter image description here

Die entsprechende Java-Quelle, die die Aufteilung durchführt, lautet: 

 enter image description here
Die Methode computeSplitSize () oben erweitert sich zu Max (minSize, min (maxSize, blockSize)), wobei die Min/Max-Größe konfiguriert werden kann, indem mapreduce.input.fileinputformat.split.minsize/maximale Größe

1
Avinash Ganta