webentwicklung-frage-antwort-db.com.de

Hadoop-Eingangssplitgröße vs. Blockgröße

Ich gehe durch die definitive Anleitung von hadoop, in der es eindeutig über die Aufteilung von Eingaben geht 

Eingangssplits enthalten keine tatsächlichen Daten, sondern den Speicher zu HDFS-Daten

und 

In der Regel entspricht die Größe der Eingangsaufteilung der Blockgröße

1) Nehmen wir an, ein 64-MB-Block befindet sich auf Knoten A und wird zwischen zwei anderen Knoten (B, C) repliziert, und die Eingangsaufteilungsgröße für das Kartenreduzierungsprogramm beträgt 64 MB ? Oder hat es Standorte für alle drei Knoten A, b, C?

2) Da Daten für alle drei Knoten lokal sind, wie das Framework entscheidet (wählt) einen Maptask, der auf einem bestimmten Knoten ausgeführt werden soll?

3) Wie wird verfahren, wenn die Input-Split-Größe größer oder kleiner als die Blockgröße ist?

19
rohith
  • Die Antwort von @ user1668782 ist eine großartige Erklärung für die Frage, und ich werde versuchen, sie grafisch darzustellen.

  • Angenommen, wir haben eine Datei mit 400 MB 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 3.

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

Hoffe das hilft.

21
tharindu_DG

Block ist die physische Darstellung von Daten . Aufteilung ist die logische Darstellung von Daten, die in Block vorhanden sind.

Block- und Splitgröße können in den Eigenschaften geändert werden.

Map liest Daten aus Block durch Splits, d. H. Split fungiert als Makler zwischen Block und Mapper.

Betrachten Sie zwei Blöcke:

Block 1 

aa bb cc dd ee ff gg hh ii jj

Block 2

ww ee yy uu oo ii oo pp kk ll nn

Nun liest map den Block 1 bis aa bis JJ und weiß nicht, wie er den Block 2 lesen soll, d. H. Der Block weiß nicht, wie er einen anderen Informationsblock verarbeiten soll. Hier kommt ein Split. Es wird eine logische Gruppierung von Block 1 und Block 2 als einzelner Block gebildet. Anschließend werden Offset (Schlüssel) und Zeile (Wert) unter Verwendung von Eingabeformat und Datensatzleser gebildet und eine Karte zur Weiterverarbeitung gesendet.

Wenn Ihre Ressource begrenzt ist und Sie die Anzahl der Maps begrenzen möchten, können Sie die Aufteilungsgröße erhöhen. Zum Beispiel: Wenn wir 640 MB 10 Blöcke haben, dh jeder Block mit 64 MB und jede Ressource ist begrenzt Split-Größe kann als 128 MB angegeben werden, dann wird eine logische Gruppierung von 128 MB gebildet, und es werden nur 5 Karten mit einer Größe von 128 MB ausgeführt.

Wenn wir angeben, dass die Aufteilungsgröße auf "false" gesetzt ist, wird die gesamte Datei aus einer Eingabeaufteilung gebildet und von einer Map verarbeitet. Dies dauert mehr Zeit, wenn die Datei groß ist.

20
VG P

Eingabeaufteilungen sind eine logische Unterteilung Ihrer Datensätze, während HDFS-Blöcke eine physische Unterteilung der Eingabedaten sind. Es ist äußerst effizient, wenn sie gleich sind, aber in der Praxis ist es nie perfekt ausgerichtet. Datensätze können Blockgrenzen überschreiten. Hadoop garantiert die Verarbeitung aller Datensätze. Eine Maschine, die eine bestimmte Aufteilung verarbeitet, kann ein Fragment eines Datensatzes von einem anderen Block als seinem "Hauptblock" abrufen, der sich entfernt befindet. Die Kommunikationskosten für das Abrufen eines Datensatzfragments sind unerheblich, da dies relativ selten vorkommt.

4
SAIKAT MOHAJAN

Die Stärke des Hadoop-Frameworks ist seine Datenlokalität. Wenn also ein Client die HDFS-Daten anfordert, prüft das Framework immer nach der Lokalität.

0
neeraj

Die HDFS-Blockgröße ist eine exakte Zahl, aber die Größe der Eingabeaufteilung basiert auf unsererdata-Logik, die mit der konfigurierten Nummer ein wenig abweichen kann

0
hadooper

Zu 1) und 2): Ich bin nicht zu 100% sicher, aber wenn die Aufgabe nicht erledigt werden kann - aus welchem ​​Grund auch immer, wenn etwas mit dem Eingangssplit falsch ist - dann wird sie beendet und an ihrer Stelle wird eine andere gestartet: also jeder maptask erhält genau einen Split mit Dateiinformationen (Sie können schnell feststellen, ob dies der Fall ist, indem Sie mit einem lokalen Cluster debuggen, um zu sehen, welche Informationen im Eingabe-Split-Objekt gespeichert sind: Ich denke daran, dass es sich nur um den einzigen Speicherort handelt).

zu 3): Wenn das Dateiformat teilbar ist, versucht Hadoop, die Datei auf "inputSplit" -Stücke zu reduzieren. Wenn nicht, ist dies eine Aufgabe pro Datei, unabhängig von der Dateigröße. Wenn Sie den Wert von minimum-input-split ändern, können Sie verhindern, dass zu viele Mapper-Tasks erzeugt werden, wenn jede Ihrer Eingabedateien in die Blockgröße unterteilt ist. Sie können jedoch nur kombinieren -Eingaben Wenn Sie mit der Combiner-Klasse etwas Magie anstreben (ich glaube, so heißt es).

0
davek

Eingangssplits sind logische Dateneinheiten, die jedem Mapper zugeführt werden. Die Daten werden auf gültige Datensätze aufgeteilt. Eingangssplits enthalten Adressen von Blöcken und Byte-Offsets.

Nehmen wir an, Sie haben eine Textdatei, die sich über 4 Blöcke erstreckt.

Datei:

A B C D
E f G H
i j k l
m n o p

Blöcke:

block1: a b c d e
block2: f g h i j
block3: k l m no
block4: p

Splits:

Split1: a b c d e f h
Split2: i j k l m n o p 

Beachten Sie, dass die Aufteilungen mit den Grenzen (Datensätzen) der Datei inline sind. Jetzt wird jeder Split einem Mapper zugeführt. 

Wenn die Eingabeaufteilungsgröße kleiner als die Blockgröße ist, werden am Ende mehr no.of-Mapper verwendet.

Hoffentlich hilft das.

0
RANJIT M