Problem der kleinen Dateien
Jeder Block wird durch HDFS verwaltet, sodass eine sehr große Menge an Blöcken (- u. U. mehrere Millionen bei sehr kleinen Dateien -) die Verwaltung des Dateisystems belastet. Sehr viele kleine Dateien bedeuten sehr viele Blöcke und damit sehr viele Einträge in der Dateiverwaltung. Viele kleine Dateien sind also zugunsten weniger großer zu vermeiden. Was aber, falls meine Dateien klein sind?
sequence
Wie wäre es viele kleine Dateien zu einer großen Datei zusammenzufassen und diese Große durch HDFS verwalten zu lassen?
So arbeitet das Dateiformat sequence. Beliebige Inhalte (auch binär) werden verpackt und mit (einem zu definierenden Schlüssel) indiziert. Daher eignet sich dieses Format gut, um viele kleine Dateien in einer großen Datei zu verpacken, um dem Problem der kleinen Daten zu begegnen.
Struktur von Daten
Daten sind besser zu verarbeiten, wenn ich etwas über die Struktur der Daten weiß. Es kann schon helfen, wenn ich weiß, dass ich eine csv-Datei verarbeite. Zumindest kann ich Spaltenwerte einem Spaltennamen zuordnen.
avro
Deutlich mehr Informationen über die Struktur einer Zeile bieten Dateien mit dem Format avro. Jede Zeile der Datei repräsentiert ein Objekt. Alle Objekte haben eine gleiche Struktur. Diese Struktur wird als (avro-) schema an den Anfang der Datei gestellt. Dieses Schema garantiert, dass die Objekte gemäß des Schemas beim Lesen wiederhergestellt werden.
Optimierung von Zugriffen
Relationale Datenbanken können nur deshalb eine ausreichende Lesegeschwindigkeit gewährleisten, weil sie Indizes und andere Optimierungen für den Zugriff nutzen. Bei großen Datenmengen ist eine sequenzielle Durchsuchung der Datenbank nach dem gewünschten Datensatz nicht mehr akzeptabel.
Mit dem gleichen Problem kämpft auch die Verarbeitung sehr großer Datenmengen in HDFS. Um einzelne Informationen aus einer Datei zu lesen, kann diese natürlich sequenziell durchlesen werden. Kommt diese Art der Verarbeitung an ihre Grenzen, so muss explizit optimiert werden.
Neben dem Problem der kleinen Dateien muss HDFS auch dieser Herausforderung begegnen. Dazu werden unterschiedliche Dateiformate unterstützt. Beim Lesen einer Datei erkennt HDFS das Dateiformat und kann seine Zugriffsverfahren optimieren.
Ein Dateiformat gibt die Struktur der Daten innerhalb der Datei vor. Bei einigen Dateiformaten wie normalen Textdateien oder cvs (comma separated values) ist die Struktur klar. Andere Dateiformate organisieren die Daten in einer internen Struktur. Diese innere Struktur wird durch Metadaten beschrieben. Diese werden als Beipackzettel mit der Datei verpackt. Nur wer den Beipackzettel kennt, kann die Datei lesen.
Hier einige der wichtigsten Dateiformate in HDFS (siehe unten [1])
parquet und orc
Bisher haben wir zeilenorientierte Formate kennengelernt. Um Daten aus diesen Dateien zu verarbeiten, sind alle sequentiellen Sätze auszulesen. Abfragen, welche sich auf Werte einzelner Spalten/Attribute der Sätze beziehen, werden nicht gut unterstützt. Spaltenorientierte Formate dagegen gruppieren die Sätze anhand von Spalten-/Attributwerten. Diese Idee der Datenorganisation kennen wird bereits aus den spaltenorientierten Datenbanken.
Die wichtigsten spaltenorientierten Dateiformate sind parquet und ORC.
Komprimierung
Ein weiterer Aspekt der Datenhaltung ist die Komprimierung der Daten. Komprimierung spart Plattenplatz auf den DataNodes und beschleunigt den Datentransfer.
Doch Komprimierung hat ihren Preis, denn Komprimierungsalgorithmen benötigen Zeit und Ressourcen.
Bei der Komprimierung ist außerdem ein Problem zu lösen. Die parallele Verarbeitung von Blöcken bedingt, dass Blöcke unabhängig voneinander sind. Wird die gesamte Datei komprimiert und anschließend in Blöcke zerlegt, so müssen vor der Verarbeitung alle Blöcke zusammengeführt und dekomprimiert werden. Erst dann stehen verarbeitbare Blöcke zur Verfügung.
Einige Kompressionsalgorithmen unterstützen Komprimierung in Blöcken (splittable), sodass solcherart komprimierte Blöcke direkt verarbeitet werden können.
Es stehen unterschiedliche Komprimierungsverfahren mit unterschiedlichen Eigenschaften und Stärken zur Verfügung (siehe unten [2]).
Die unterschiedlichen Dateiformate werden im Wesentlichen von allen Systemen unterstützt und bilden damit die Plattform zum Austausch von Daten zwischen den einzelnen Systemen.