HDFS-Tutorial: ArchiTektur, Lesen und Schreiben Operation verwenden Java API
Was ist HDFS?
HDFS ist ein verteiltes Dateisystem zum Speichern sehr großer Datendateien, das auf Clustern handelsüblicher Hardware ausgeführt wird. Es ist fehlertolerant, skalierbar und extrem einfach zu erweitern. Hadoop wird mitgeliefert mit HDFS (Verteilte Hadoop-Dateisysteme).
Wenn die Daten die Speicherkapazität einer einzelnen physischen Maschine überschreiten, ist es unerlässlich, sie auf mehrere separate Maschinen zu verteilen. Ein Dateisystem, das speicherspezifische Vorgänge über ein Netzwerk von Maschinen verwaltet, wird als verteiltes Dateisystem bezeichnet. HDFS ist eine solche Software.
HDFS Architektur
HDFS-Cluster bestehen im Wesentlichen aus einem NameNode das das Dateisystem verwaltet Metadaten und eine Datenknoten das speichert die wirkliche Daten.
- Namensknoten: NameNode kann als Master des Systems betrachtet werden. Es verwaltet den Dateisystembaum und die Metadaten für alle im System vorhandenen Dateien und Verzeichnisse. Zwei Dateien 'Namespace-Bild' und den 'Protokoll bearbeiten' werden zum Speichern von Metadateninformationen verwendet. Namenode kennt alle Datenknoten, die Datenblöcke für eine bestimmte Datei enthalten, speichert die Blockspeicherorte jedoch nicht dauerhaft. Diese Informationen werden jedes Mal beim Systemstart aus Datenknoten rekonstruiert.
- Datenknoten: DataNodes sind Slaves, die sich auf jeder Maschine in einem Cluster befinden und den eigentlichen Speicher bereitstellen. Sie sind für die Bearbeitung von Lese- und Schreibanforderungen der Clients verantwortlich.
Lese-/Schreibvorgänge in HDFS erfolgen auf Blockebene. Datendateien in HDFS werden in blockgroße Blöcke aufgeteilt, die als unabhängige Einheiten gespeichert werden. Die Standardblockgröße beträgt 64 MB.
HDFS basiert auf einem Konzept der Datenreplikation, bei dem mehrere Replikate von Datenblöcken erstellt und auf Knoten in einem Cluster verteilt werden, um bei einem Knotenausfall eine hohe Datenverfügbarkeit zu gewährleisten.
Weißt du es? Eine Datei in HDFS, die kleiner als ein einzelner Block ist, belegt nicht den gesamten Speicher eines Blocks.
Lesen Sie mehr Operation in HDFS
Die Datenleseanforderung wird von HDFS, NameNode und DataNode bedient. Nennen wir den Leser „Client“. Das folgende Diagramm zeigt den Dateilesevorgang in Hadoop.
- Ein Client initiiert eine Leseanforderung durch Aufruf 'offen()' Methode des FileSystem-Objekts; es ist ein Objekt vom Typ Verteiltes Dateisystem.
- Dieses Objekt stellt über RPC eine Verbindung zum Namenode her und ruft Metadateninformationen wie die Speicherorte der Blöcke der Datei ab. Bitte beachten Sie, dass es sich bei diesen Adressen um die ersten Blöcke einer Datei handelt.
- Als Antwort auf diese Metadatenanforderung werden die Adressen der DataNodes zurückgegeben, die eine Kopie dieses Blocks haben.
-
Sobald Adressen von DataNodes empfangen wurden, wird ein Objekt vom Typ „ FSDataInputStream wird an den Kunden zurückgegeben. FSDataInputStream enthält DFSInputStream welches sich um die Interaktionen mit DataNode und NameNode kümmert. In Schritt 4, der im obigen Diagramm gezeigt wird, ruft ein Client auf 'lesen()' Methode, die verursacht DFSInputStream um eine Verbindung mit dem ersten DataNode mit dem ersten Block einer Datei herzustellen.
-
Daten werden in Form von Streams gelesen, die vom Client aufgerufen werden 'lesen()' Methode wiederholt. Dieser Prozess von lesen() Der Vorgang wird fortgesetzt, bis das Blockende erreicht ist.
- Sobald das Ende eines Blocks erreicht ist, schließt DFSInputStream die Verbindung und sucht weiter nach dem nächsten DataNode für den nächsten Block
- Sobald ein Kunde mit der Lesung fertig ist, ruft er an ein enger() Methode.
Schreiben Operation in HDFS
In diesem Abschnitt werden wir verstehen, wie Daten über Dateien in HDFS geschrieben werden.
- Ein Client leitet einen Schreibvorgang ein, indem er die Methode „create()“ des DistributedFileSystem-Objekts aufruft, das eine neue Datei erstellt – Schritt Nr. 1 im obigen Diagramm.
- Das DistributedFileSystem-Objekt stellt über einen RPC-Aufruf eine Verbindung zum NameNode her und initiiert die Erstellung einer neuen Datei. Dieser Vorgang zum Erstellen einer Datei verknüpft jedoch keine Blöcke mit der Datei. Es liegt in der Verantwortung von NameNode, zu überprüfen, ob die Datei (die erstellt wird) noch nicht vorhanden ist und ein Client über die richtigen Berechtigungen zum Erstellen einer neuen Datei verfügt. Wenn eine Datei bereits vorhanden ist oder der Client nicht über ausreichende Berechtigungen zum Erstellen einer neuen Datei verfügt, dann IOException wird an den Client gesendet. Andernfalls ist der Vorgang erfolgreich und der NameNode erstellt einen neuen Datensatz für die Datei.
- Sobald ein neuer Datensatz in NameNode erstellt wird, wird ein Objekt vom Typ FSDataOutputStream an den Client zurückgegeben. Ein Client verwendet es, um Daten in das HDFS zu schreiben. Die Datenschreibmethode wird aufgerufen (Schritt 3 im Diagramm).
- FSDataOutputStream enthält das DFSOutputStream-Objekt, das sich um die Kommunikation mit DataNodes und NameNode kümmert. Während der Client weiterhin Daten schreibt, DFSOutputStream erstellt weiterhin Pakete mit diesen Daten. Diese Pakete werden in eine Warteschlange mit dem Namen eingereiht Datenwarteschlange.
- Es gibt noch eine weitere Komponente namens DataStreamer was das verbraucht Datenwarteschlange. DataStreamer bittet NameNode auch um die Zuweisung neuer Blöcke und wählt so die gewünschten DataNodes aus, die für die Replikation verwendet werden sollen.
- Nun beginnt der Replikationsprozess mit der Erstellung einer Pipeline mithilfe von DataNodes. In unserem Fall haben wir eine Replikationsebene von 3 gewählt und daher befinden sich 3 DataNodes in der Pipeline.
- Der DataStreamer leitet Pakete an den ersten DataNode in der Pipeline weiter.
- Jeder DataNode in einer Pipeline speichert die von ihm empfangenen Pakete und leitet diese an den zweiten DataNode in einer Pipeline weiter.
- Eine weitere Warteschlange, „Ack Queue“, wird von DFSOutputStream verwaltet, um Pakete zu speichern, die auf eine Bestätigung von DataNodes warten.
- Sobald von allen DataNodes in der Pipeline eine Bestätigung für ein Paket in der Warteschlange empfangen wurde, wird es aus der „Ack-Warteschlange“ entfernt. Im Falle eines DataNode-Fehlers werden Pakete aus dieser Warteschlange verwendet, um den Vorgang erneut zu starten.
- Nachdem ein Client mit dem Schreiben der Daten fertig ist, ruft er eine close()-Methode auf (Schritt 9 im Diagramm). Der Aufruf von close() führt dazu, dass verbleibende Datenpakete in die Pipeline geleert und anschließend auf die Bestätigung gewartet wird.
- Sobald eine endgültige Bestätigung eingegangen ist, wird NameNode kontaktiert, um ihm mitzuteilen, dass der Dateischreibvorgang abgeschlossen ist.
Greifen Sie über die JAVA-API auf HDFS zu
In diesem Abschnitt versuchen wir es zu verstehen Java Schnittstelle für den Zugriff auf das Dateisystem von Hadoop.
Um programmgesteuert mit dem Dateisystem von Hadoop interagieren zu können, stellt Hadoop mehrere JAVA-Klassen bereit. Das Paket mit dem Namen org.apache.hadoop.fs enthält Klassen, die für die Manipulation einer Datei im Dateisystem von Hadoop nützlich sind. Diese Vorgänge umfassen Öffnen, Lesen, Schreiben und Schließen. Tatsächlich ist die Datei-API für Hadoop generisch und kann erweitert werden, um mit anderen Dateisystemen als HDFS zu interagieren.
Programmgesteuertes Lesen einer Datei aus HDFS
Objekt java.net.URL wird zum Lesen des Inhalts einer Datei verwendet. Zunächst müssen wir Java erkennen Hadoops hdfs URL-Schema. Dies geschieht durch den Aufruf setURLStreamHandlerFactory Methode für URL-Objekt und eine Instanz von FsUrlStreamHandlerFactory wird daran übergeben. Diese Methode muss nur einmal pro ausgeführt werden JVM, daher ist es in einem statischen Block eingeschlossen.
Ein Beispielcode ist-
public class URLCat { static { URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); } public static void main(String[] args) throws Exception { InputStream in = null; try { in = new URL(args[0]).openStream(); IOUtils.copyBytes(in, System.out, 4096, false); } finally { IOUtils.closeStream(in); } } }
Dieser Code öffnet und liest den Inhalt einer Datei. Der Pfad dieser Datei auf HDFS wird als Befehlszeilenargument an das Programm übergeben.
Greifen Sie über die Befehlszeilenschnittstelle auf HDFS zu
Dies ist eine der einfachsten Möglichkeiten, mit HDFS zu interagieren. Die Befehlszeilenschnittstelle unterstützt Dateisystemvorgänge wie das Lesen von Dateien, Erstellen von Verzeichnissen, Verschieben von Dateien, Löschen von Daten und Auflisten von Verzeichnissen.
Wir können laufen '$HADOOP_HOME/bin/hdfs dfs -help' um detaillierte Hilfe zu jedem Befehl zu erhalten. Hier, 'dfs' ist ein Shell-Befehl von HDFS, der mehrere Unterbefehle unterstützt.
Nachfolgend sind einige der häufig verwendeten Befehle zusammen mit den jeweiligen Einzelheiten aufgeführt.
1. Kopieren Sie eine Datei vom lokalen Dateisystem nach HDFS
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /
Dieser Befehl kopiert die Datei temp.txt vom lokalen Dateisystem nach HDFS.
2. Wir können die in einem Verzeichnis vorhandenen Dateien auflisten mit -ls
$HADOOP_HOME/bin/hdfs dfs -ls /
Wir können eine Datei sehen 'temp.txt' (früher kopiert) wird unten aufgeführt '/' Verzeichnis.
3. Befehl zum Kopieren einer Datei von HDFS in das lokale Dateisystem
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
Wir sehen temp.txt in ein lokales Dateisystem kopiert.
4. Befehl zum Erstellen eines neuen Verzeichnisses
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Überprüfen Sie, ob ein Verzeichnis erstellt wurde oder nicht. Jetzt sollten Sie wissen, wie es geht 😉