Big Data - Die Serie Teil 04

Wie verpacke ich meine Daten?

Tausende unterschiedliche Kartons stapeln? Das funktioniert nicht. Weiß jeder, der einen Keller hat. Irgendwie ist das mit Big Data ähnlich. Wie HDFS diesem Problem begegnet erklärt Teil vier der großen Big Data Serie.

Überblick über Dateiformate in HDFS

HDFS (Hadoop Distributed Filesystem) ist das verteilte Dateisystem im Hadoop-Ökosystem. In Teil 3 der Big Data-Serie haben wir gesehen, dass HDFS Daten in Blöcken organisiert und partitioniert.

HDFS stellt grundsätzlich keinerlei Anforderungen an die Struktur der Daten. Daher eignet es sich  gut, um Rohdaten aus beliebigen Quellen zu speichern.

Daten werden in Blöcken gespeichert. Ein Block ist die kleinste Einheit, in der Daten verwaltet werden. Da HDFS für große Dateien ausgelegt ist, sind auch die Blöcke relativ groß (128 MB). Die Größe ist unabhängig von der Datei, sodass sowohl kleine, als auch große Dateien mit derselben Blockgröße behandelt werden.

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.



Artikel 01 der Big Data Serie: Hilfe, wo soll ich anfangen?

Artikel 02 der Big Data Serie: Wer hängt im Hadoop-Ökosystem mit wem zusammen?

Artikel 03 der Big Data Serie: Wohin mit meinen Daten?

 

Jetzt teilen: