Was ist HDFS?
HDFS ist ein verteiltes Dateisystem zum Speichern sehr großer Datendateien, die auf Clustern von Standardhardware ausgeführt werden. Es ist fehlertolerant, skalierbar und extrem einfach zu erweitern. Hadoop wird mit HDFS ( Hadoop Distributed File Systems ) geliefert .
Wenn Daten die Speicherkapazität auf einem einzelnen physischen Computer überschreiten, ist es wichtig, sie auf mehrere separate Computer aufzuteilen. Ein Dateisystem, das speicherspezifische Vorgänge in einem Netzwerk von Computern verwaltet, wird als verteiltes Dateisystem bezeichnet. HDFS ist eine solche Software.
In diesem Tutorial lernen wir:
- Was ist HDFS?
- HDFS-Architektur
- Betrieb lesen
- Schreibvorgang
- Greifen Sie mit der JAVA-API auf HDFS zu
- Greifen Sie über die COMMAND-LINE-SCHNITTSTELLE auf HDFS zu
HDFS-Architektur
Der HDFS-Cluster besteht hauptsächlich aus einem NameNode , der die Metadaten des Dateisystems verwaltet, und einem DataNodes , der die tatsächlichen Daten speichert .
- NameNode: 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-Image' und 'Bearbeitungsprotokoll' werden zum Speichern von Metadateninformationen verwendet. Namenode kennt alle Datenknoten, die Datenblöcke für eine bestimmte Datei enthalten, speichert jedoch die Blockpositionen nicht dauerhaft. Diese Informationen werden jedes Mal aus Datenknoten rekonstruiert, wenn das System gestartet wird.
- DataNode: DataNodes sind Slaves, die sich auf jedem Computer in einem Cluster befinden und den tatsächlichen Speicher bereitstellen. Es ist dafür verantwortlich, Anfragen für die Kunden zu bearbeiten, zu lesen und zu schreiben.
Lese- / Schreibvorgänge in HDFS werden auf Blockebene ausgeführt. Datendateien in HDFS werden in Blockblöcke aufgeteilt, die als unabhängige Einheiten gespeichert werden. Die Standardblockgröße beträgt 64 MB.
HDFS arbeitet nach einem Konzept der Datenreplikation, bei dem mehrere Replikate von Datenblöcken erstellt und auf Knoten in einem Cluster verteilt werden, um eine hohe Verfügbarkeit von Daten im Falle eines Knotenausfalls zu ermöglichen.
Wissen Sie? Eine Datei in HDFS, die kleiner als ein einzelner Block ist, belegt nicht den vollen Speicher eines Blocks.
Lesevorgang in HDFS
Die Datenleseanforderung wird von HDFS, NameNode und DataNode bereitgestellt. Nennen wir den Leser einen "Kunden". Das folgende Diagramm zeigt den Vorgang zum Lesen von Dateien in Hadoop.
- Ein Client initiiert eine Leseanforderung, indem er die Methode 'open ()' des FileSystem-Objekts aufruft . Es ist ein Objekt vom Typ DistributedFileSystem .
- Dieses Objekt stellt über RPC eine Verbindung zum Namensknoten her und ruft Metadateninformationen ab, z. B. die Speicherorte der Blöcke der Datei. Bitte beachten Sie, dass diese Adressen aus den ersten Blöcken einer Datei bestehen.
- Als Antwort auf diese Metadatenanforderung werden Adressen der DataNodes mit einer Kopie dieses Blocks zurückgegeben.
- Sobald Adressen von DataNodes empfangen wurden, wird ein Objekt vom Typ FSDataInputStream an den Client zurückgegeben. FSDataInputStream enthält DFSInputStream, der sich um Interaktionen mit DataNode und NameNode kümmert. In Schritt 4, der im obigen Diagramm gezeigt ist, ruft ein Client die Methode 'read ()' auf , die bewirkt, dass DFSInputStream eine Verbindung mit dem ersten DataNode mit dem ersten Block einer Datei herstellt.
- Daten werden in Form von Streams gelesen, wobei der Client die Methode 'read ()' wiederholt aufruft . Dieser Vorgang der read () - Operation wird fortgesetzt, bis das Ende des Blocks erreicht ist.
- Sobald das Ende eines Blocks erreicht ist, schließt DFSInputStream die Verbindung und sucht den nächsten DataNode für den nächsten Block
- Sobald ein Client mit dem Lesen fertig ist, ruft er eine close () -Methode auf.
Schreibvorgang in HDFS
In diesem Abschnitt erfahren Sie, wie Daten über Dateien in HDFS geschrieben werden.
- Ein Client initiiert den Schreibvorgang, indem er die Methode 'create ()' des DistributedFileSystem-Objekts aufruft, mit der eine neue Datei erstellt wird - Schritt-Nr. 1 im obigen Diagramm.
- Das DistributedFileSystem-Objekt stellt über einen RPC-Aufruf eine Verbindung zum NameNode her und initiiert die Erstellung neuer Dateien. Diese Operation zum Erstellen von Dateien ordnet der Datei jedoch keine Blöcke zu. Es liegt in der Verantwortung von NameNode, zu überprüfen, ob die Datei (die gerade 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, wird IOException an den Client gesendet . Andernfalls ist der Vorgang erfolgreich und ein neuer Datensatz für die Datei wird vom NameNode erstellt.
- Sobald ein neuer Datensatz in NameNode erstellt wurde, 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 die Kommunikation mit DataNodes und NameNode überwacht. Während der Client weiterhin Daten schreibt, erstellt DFSOutputStream weiterhin Pakete mit diesen Daten. Diese Pakete werden in eine Warteschlange eingereiht, die als DataQueue bezeichnet wird .
- Es gibt eine weitere Komponente namens DataStreamer, die diese DataQueue verwendet . DataStreamer fordert NameNode außerdem zur Zuweisung neuer Blöcke auf, wodurch die gewünschten DataNodes ausgewählt werden, die für die Replikation verwendet werden sollen.
- Der Replikationsprozess beginnt nun mit der Erstellung einer Pipeline mit DataNodes. In unserem Fall haben wir eine Replikationsstufe von 3 gewählt und daher befinden sich 3 DataNodes in der Pipeline.
- Der DataStreamer schüttet Pakete in den ersten DataNode in der Pipeline.
- Jeder DataNode in einer Pipeline speichert das von ihm empfangene Paket und leitet es an den zweiten DataNode in einer Pipeline weiter.
- Eine andere Warteschlange, 'Ack Queue', wird von DFSOutputStream verwaltet, um Pakete zu speichern, die auf die Bestätigung von DataNodes warten.
- Sobald die Bestätigung für ein Paket in der Warteschlange von allen DataNodes in der Pipeline empfangen wurde, wird sie aus der 'Ack Queue' 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). Call to close () führt dazu, dass verbleibende Datenpakete in die Pipeline geleert werden und anschließend auf die Bestätigung gewartet wird.
- Sobald eine endgültige Bestätigung empfangen wurde, wird NameNode kontaktiert, um ihm mitzuteilen, dass der Dateischreibvorgang abgeschlossen ist.
Greifen Sie mit der JAVA-API auf HDFS zu
In diesem Abschnitt versuchen wir, die Java-Schnittstelle zu verstehen, die für den Zugriff auf das Dateisystem von Hadoop verwendet wird.
Um programmgesteuert mit dem Dateisystem von Hadoop interagieren zu können, bietet Hadoop mehrere JAVA-Klassen an. Das Paket org.apache.hadoop.fs enthält Klassen, die bei der Bearbeitung einer Datei im Dateisystem von Hadoop hilfreich 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
Das Objekt java.net.URL wird zum Lesen des Inhalts einer Datei verwendet. Zunächst müssen wir dafür sorgen, dass Java das HDFS-URL-Schema von Hadoop erkennt. Dies erfolgt durch Aufrufen der Methode setURLStreamHandlerFactory für das URL-Objekt, und eine Instanz von FsUrlStreamHandlerFactory wird an dieses übergeben. Diese Methode muss nur einmal pro JVM ausgeführt werden und ist daher 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 in HDFS wird als Befehlszeilenargument an das Programm übergeben.
Greifen Sie über die COMMAND-LINE-SCHNITTSTELLE auf HDFS zu
Dies ist eine der einfachsten Möglichkeiten, mit HDFS zu interagieren. Die Befehlszeilenschnittstelle unterstützt Dateisystemvorgänge wie das Lesen der Datei, das Erstellen von Verzeichnissen, das Verschieben von Dateien, das Löschen von Daten und das Auflisten von Verzeichnissen.
Wir können '$ HADOOP_HOME / bin / hdfs dfs -help' ausführen, um detaillierte Hilfe zu jedem Befehl zu erhalten. Hier ist 'dfs' ein Shell-Befehl von HDFS, der mehrere Unterbefehle unterstützt.
Einige der weit verbreiteten Befehle sind nachstehend zusammen mit einigen Details zu den einzelnen Befehlen aufgeführt.
1. Kopieren Sie eine Datei aus dem lokalen Dateisystem nach HDFS
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /
Dieser Befehl kopiert die Datei temp.txt aus dem lokalen Dateisystem nach HDFS.
2. Wir können Dateien, die in einem Verzeichnis vorhanden sind, mit -ls auflisten
$HADOOP_HOME/bin/hdfs dfs -ls /
Wir können sehen, dass eine Datei 'temp.txt' (früher kopiert) im Verzeichnis '/' aufgeführt ist .
3. Befehl zum Kopieren einer Datei von HDFS in das lokale Dateisystem
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
Wir können sehen, dass temp.txt in ein lokales Dateisystem kopiert wird.
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 solltest du wissen, wie es geht ;-)