Eine Einführung in HDFS

Eine Einführung in HDFS

  • Künstliche Intelligenz
6 Minuten Lesezeit Aktualisiert Apr 24, 2017

Auf einen Blick: Eine Einführung in HDFS erklärt seine Architektur und Dateiverwaltung innerhalb von Hadoop, hebt Datenreplikation zur Widerstandsfähigkeit sowie Einschränkungen wie die Unfähigkeit zur Aktualisierung von Dateien hervor. Außerdem wird die Eignung von HDFS für die Batchverarbeitung und das Wachstumspotenzial unbegrenzter Dateigrößen hervorgehoben.

  • HDFS unterstützt unbegrenztes Dateigrößenwachstum durch Metadatenspeicherung in einem Namenode.
  • Dateien können nur geschrieben oder gelöscht werden, was das Design für die Batch-Verarbeitung verstärkt.

HDFS-Namensknoten und Datenknoten

Hadoop besteht aus zwei Hauptteilen: einer verteilten Architektur zum Ausführen von MapReduce-Jobs, also Java- und anderen Programmen, die Daten von einem Format in ein anderes konvertieren, sowie ein verteiltes Dateisystem (HDFS) zur Speicherung von Daten in einer verteilten Architektur. Hier besprechen wir HDFS.

In einer regulären Datei auf einem normalen PC oder Server speichert der Computer Dateien in zusammenhängenden Festplattenspeicher, die als Blöcke bezeichnet werden. Ein zentraler Mechanismus verfolgt den Blick, welche Blöcke auf welchem Festplattenstandort gespeichert sind. Auf einem PC oder Server wird das FAT (File Allocation Table) oder NTFS (New Technology File System) genannt. Außerdem gibt es weitere Strukturen, die festhalten, welche Daten wo geschrieben werden.

Auf einem magnetischen Festplattenlaufwerk werden die Daten mit einem beweglichen Gerät, einem sogenannten Festplattencontroller, auf die Festplatte geschrieben. In HDFS werden Schreibvorgänge über das Netzwerk über Hadoop-Netzwerkprotokolle auf einzelne Server übertragen, die dann Hadoop-Datennotizoperationen zusammen mit FAT oder NTFS oder etwas Ähnlichem nutzen, um in die Datenblöcke des Host-Rechners zu schreiben. Dies ist meist lokal angeschlossener Speicher, um die Kosten zu senken, statt eines Speicherarrays wie ein Speicherrack. (Niedrige Betriebskosten sind einer der Verkaufsargumente von Hadoop.)

Hadoop beseitigt die physischen Beschränkungen fester Festplattengrößen, indem es Dateimetadaten (d. h. den Standort der Blöcke) in einem Name-Node-Prozess auf dem Masterserver und die Daten auf einer beliebigen unendlichen Anzahl von Datenknoten speichert.

Datanode-Prozesse, die auf jedem Knoten im Cluster laufen, verarbeiten, um Daten auf dort liegende Festplattenblöcke zu schreiben.

Im Gegensatz zu einem regulären Dateisystem kann das HDFS unbegrenzt wachsen, da Architektur und Administrator Knoten nach Belieben hinzufügen können. Diese Abstraktion einer einzelnen Datei über mehrere Computer hinweg ermöglicht es, dass Dateien unbegrenzt in ihrer Größe wachsen.

Aber es dient auch als praktische Bucket-Notation, bei der Nutzer Dateien konventionell speichern können, ohne sich Gedanken darüber machen zu müssen, in welchem Verzeichnis sie eingebunden sind, usw. Zum Beispiel können sie jede Art von Datei auf hdfs://(Servername):p ort kopieren und diese von jedem Computer im Netzwerk abrufen.

Viele andere Big-Data-Produkte wie Spark, Storm, Cassandra Hbase, Hive usw. nutzen zumindest einen Teil von HDFS für ihre Anwendungen.

play

HDFS schreibt nur Daten, aktualisiert nicht

In Hadoop kannst du nur Dateien schreiben und löschen. Du kannst sie nicht aktualisieren.

Das System ist darauf ausgelegt, widerstandsfähig und fehlersicher zu sein, denn wenn jeder Datenknoten seinen Speicher auf Festplattendatenblöcke schreibt, schreibt er diesen Speicher auch per Replikation an einen anderen Server. Die Anzahl der Replikate wird vom Benutzer festgelegt. Und Dataknoten können im Rack bewusst gemacht werden. Dies ist notwendig, weil Redundanz nicht funktioniert, wenn man Daten auf zwei Festplattenlaufwerke im selben Rack schreibt, die dieselbe Stromversorgung und Netzwerkverbindungen teilen.

Datenblöcke auf einem normalen PC sind etwa 4K oder 64K groß. Aber in Hadoop sind sie oft 64 MB.

Hadoop ist ein Batch-System, daher ist es nicht dafür ausgelegt, Daten schnell zu lesen. Stattdessen ist es dafür ausgelegt, große Datenmengen zu schreiben und diese mithilfe von Batch-MapReduce-Jobs abzurufen.

Im Folgenden zeigen wir ein Diagramm der Grundarchitektur.

Hier sehen wir einen Mount-Punkt/Home/foo/Data. Dies wird Namespace genannt. Dieser Ordner existiert auf keiner Festplatte, er ist lediglich eine Abstraktion über den Cluster. Der Namespace existiert über alle Datanodes.

Der Namenode teilt den Datanodes an, wo sie Daten schreiben sollen. Die Datanodes berichten zurück, in welchen Block und auf welches Laufwerk sie Daten an den Namenode geschrieben haben, sodass ein zentrales Repository das wissen kann. Der Namenode dupliziert diese Informationen in einen sekundären Name-Node.

Die Datenknoten schreiben Daten im Blockformat in lokalen Speicher, genau wie bei einem normalen PC. Im Falle eines defekten Festplattenlaufwerks kann der Namenode die Daten auf einer anderen Datennotiz rekonstruieren. (In einem großen Rechenzentrum fallen Festplatten täglich aus.) Der Namenode verwendet das Editlog, um alle Schreibvorgänge zu verfolgen. Das Edit-Log wird auf den Namenode-Server auf dem regulären Festplattenspeicher geschrieben. Diese Datei wird FSImage genannt. Hadoop beschneidet den Editlog, da Transaktionen die FSImage-Metadatendatei zu den Datenknoten geschrieben werden.

HDFS CLI

Man arbeitet mit Hadoop-Dateien entweder von einem Client-Programm, das die API nutzt, wie das unten gezeigte Java-Programm, oder mit der Kommandozeile. Die Befehle sind fast identisch mit normalen Linux-Befehlen: ls, mkdir, chown usw. Sie sind also sehr einfach zu bedienen. Der einzige Unterschied ist, dass man "hadoop fs -(Befehl" schreibt. Zum Beispiel listet hadoop fs -ls Dateien in einem Verzeichnis (Namensraum) auf.

Die vollständige Liste der CLI-Befehle lautet:

    appendToFile cat checksum chgrp chmod chown copyFromLocal copyToLocal count cp createSnapshot deleteSnapshot df du dus expunge find get getfacl getfattr getmerge help ls lsr mkdir moveFromLocal moveToLocal mv put renameSnapshot rm rmdir rmr setfacl setfattr setrep stat tail test text touchz truncate usage

Die Ausgabe des Befehls sieht genau wie ein normaler Linux-Befehl aus:

    hadoop fs -ls /data
-rw-r--r--   1 root supergroup    1081141 2017-03-31 15:37 /data/ssh.log

HDFS-Konfiguration

Die HDFS-Parameterliste ist sehr lang und wird am besten im Hadoop-Handbuch überprüft. Kurz gesagt, es gibt nur wenige Parameter, die man setzen muss, um Hadoop im lokalen oder Node-Modus zum Laufen zu bringen. Die gebräuchlichsten im Zusammenhang mit Speicher sind unten aufgeführt:

hdfs-site.xml

    dfs.namenode.name.dir
      file:///usr/local/hadoop
   

      dfs.datanode.name.dir
      file:///usr/local/hadoop

core-site.xml

    fs.defaultFS
      hdfs://hadoop-master:9000/
   

Turns on or off permissions checking.

   
      dfs.permissions
      false

Java

Hadoop ist in Java geschrieben. Apache Pig erstellt Java MapReduce-Programme basierend auf SQL-Befehlen, die in die Konsole eingegeben werden. Es ist also gut, Java zu kennen, wenn man mit HDFS arbeiten möchte.

Hier ist ein Beispielprogramm Hdfs.java, um einen String in eine Datei in HDFS zu kopieren.

Zuerst die Umwelt:

    export HADOOP_CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath)

Kompiliere das Programm folgendermaßen:

    javac -classpath ${HADOOP_CLASSPATH} Hdfs.java

Dann führe es so aus:

    java -cp .:$HADOOP_CLASSPATH Hdfs

Hier ist die Quelle Hdfs.java.

    import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class Hdfs {


public static void main(String[] args) throws IOException {

Configuration conf = new Configuration ();
FileSystem fileSystem = FileSystem.get(conf);

	Path path = new Path("/data/silly.txt");

  FSDataOutputStream out = fileSystem.create(path);


String helloWorld = "Hello Hadoop World.";

out.writeBytes(helloWorld);

out.close();
fileSystem.close();

}

}

Wenn wir dies zum ersten Mal ausführen, erhalten wir diesen Fehler:

    Permission denied: user=walker, access=WRITE, inode="/data":root:supergroup:drwxr-xr-x

Ändere also die Ordnerberechtigung genauso wie mit dem Linux-Chagun-Befehl:

    hadoop ds -chown walker /data

Dann versuche ich den Inhalt der Datei, um zu zeigen, dass es funktioniert hat:

    hadoop fs -cat /data/silly.txt
 
Hello Hadoop World.

Hadoop-Dateinamen

Hadoop-Dateien, die von Map und Reduce erstellt werden, werden als unterschiedliche Anzahl von Dateien in Ordnern gespeichert.

Das liegt daran, dass solche Jobs in parallele Prozesse aufgeteilt und im gesamten Cluster ausgeführt werden.

Wenn du also einen MapReduce-Job ausführst und den Ausgabeordner wie folgt einsetzt:

    FileOutputFormat.setOutputPath(job, “/data.txt);

Die Ausgabe wird in Dateien namens "success" und "partn" im Ordner /data.txt/ aufgeteilt, wobei n von 1 bis zu den vielen Partitionen liegt, in die dieser Schritt unterteilt wurde.

Hadoop-Dateispeicher

Hadoop verwendet mehrere Dateispeicherformate, darunter Avro, Parquet, Sequence und Text.

Avro

Avro-Serialisierung für Hadoop schreibt Daten im JSON-Byte-Format, sodass sie von Programmen in jeder beliebigen Sprache konsumiert werden können. Avro ist in Hadoop integriert. (Serialisierung bedeutet, Daten in Speicher zu schreiben, wie zum Beispiel ein Feld, eine Websitzung oder Datei.) Mit Avro kann man komplexe Strukturen (Arrays, customClass) zusätzlich zu Primitiven (z. B. int, float, boolean) darstellen.

Parkett

Parquet ist ein Zeilen- und Spaltenspeicherformat, das von Cloudera und Twitter zu Hadoop hinzugefügt wurde. Es ähnelt Hbase, einem Speichermechanismus auf Hadoop, um Datenspalten nahe beieinander zu speichern, um einen schnellen Abruf in einem Zeilen-Spalten-Speicherdesign zu ermöglichen. HBase ist die Open-Source-Implementierung für Googles Big Table-Datenbank. Parquet ist darauf ausgelegt, komplexe Strukturen in großen Mengen zu serialisieren, wie die Klassen, die Sie in Java, Python und anderen Sprachen definieren, zusammen mit deren Mitgliedsfeldern und Funktionen. Parquet unterstützt außerdem APache Hive, Pig und Spark Storage.

Sequenzdateien

Ist eine JSON-Textdatei, aber in Binärform gespeichert (Key-Value= Format). Also wird (a=>b) als (01100001->01100010) gespeichert. Es gibt drei Arten von Sequenzdateien, wobei der Unterschied darin besteht, ob Schlüssel und Werte komprimiert sind oder nicht. Diese verwenden diese Codecs für die Kompression: BZip2Codec, DefaultCodec, GzipCodec. Ohne zu erklären, wie diese funktionieren, wird beobachtet, dass eine Folge von 6 Bits von 1 als etwas wie "6 1" geschrieben werden könnte, was weniger Platz einnimmt als 6 tatsächliche 1s.

Klartext (CSV und txt)

Es bedarf keiner Erklärung. In Java wird es als folgt bezeichnet:

    job.setOutputFormatClass(TextOutputFormat.class);

Hadoop in der Wolke

Verschiedene Anbieter haben ihre eigene Hadoop-Abstraktion implementiert, zum Beispiel Windows Azure sowie Amazon EC2 und S3. S3 ist tatsächlich bereits ein URL-ähnliches Dateisystem wie Hadoop, das Verzeichnisnamen wie //server/directory/file durch URLs http:// ersetzt. Cloudera hat Hadoop zum Hauptgeschäft gemacht.

Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.

Mehr aus Künstliche Intelligenz

Abonnieren Sie The Brief

Mit der Registrierung für dieses Angebot bestätigen Sie, dass Sie die Datenschutzrichtlinie von BMC gelesen und zugestimmt haben.

Danke

Sie haben The Brief abonniert
Das Briefing umfasst die Mainframe- und Enterprise-Orchestrierung – BMC AMI und Control-M – sowie die Analystenforschung, Kundeneinsätze und Events in beiden Bereichen.