Articles

Kodierung, Komprimierung, Parquet und Hive

Auf dem CDH 5.14 Cluster habe ich einen Größenvergleich für Einfügungen mit Hive vs. Impala in eine Tabelle mit Parquet-Dateiformat durchgeführt. Ich hatte den Eindruck, da beide Dateiformate gleich sind, sollten sie sich ähnlich verhalten (mit Standard-Kompressionscodec), um ungefähr die gleiche Größe zu erhalten. Allerdings ist mir aufgefallen, dass die von Impala geschriebene Parquet-Datei viel kleiner ist als die von Hive geschriebene für die gleichen Eingabedaten.

So habe ich angefangen, mir die von Hive geschriebene Parquet-Datei anzusehen und bin auf Beobachtungen gestoßen, die tatsächlich geholfen haben, den Punkt zu verstehen, an dem vielleicht alle Anfänger auf eine Art Verwirrung über Kodierung vs. Komprimierung gestoßen sein sollten (hier bezogen auf Hive-Hdfs-Tabellen). D.h. Spezifischer Unterschied zwischen Kodierung und Komprimierung und wie Hive damit umgeht.

Was ich denke, ist der allgemeine Unterschied zwischen Kodierung und Komprimierung –

  • Kodierung: Es ist mehr auf der Anwendungsebene, wo die Datendarstellung geändert wird. Die Kodierung kann auch den Platzbedarf minimieren, was eine Art Komprimierung darstellt.
  • Komprimierung: Im Allgemeinen ist es die Technik, den Speicherplatz für gegebene Daten in Bytes zu reduzieren, unabhängig davon, ob die Daten bereits kodiert sind oder nicht.

Das oben Gesagte wird durch die folgende Beobachtung bestätigt.

  • Erstellte Hive mit Parquet-Dateiformat.
  • Insertierte einige Daten, die ca. 1 GB an Parquet-Dateien als Teil des Inserts erstellt hatten.
  • Um einen Blick auf die Parquet-Datei zu werfen, kopierte ich die Datei von hdfs nach lokal, um sie zu dumpen (nur zur Info – es gibt auch Möglichkeiten, von hdfs zu dumpen). Dann validiert mit dem parquet-meta-Dienstprogramm, das die Parquet-Datei dumpen kann.
  • ./parquet-.meta <Dateiname>

Auszug aus Parkett-.meta dump
  • Wo drin steht, jede Spalte mit verschiedenen Kodierungstechniken (Wert von ENC) kodiert ist, wie z.B. Lauflänge, Bit gepackt usw. (wir werden die Kodierung selbst nicht diskutieren). Allerdings verwendet die von Hive geschriebene Parquet-Datei standardmäßig keine Komprimierung. Die Größe der Datei betrug 1 GB.

Nächstes

  • Die im vorgenannten Test verwendete Tabelle wurde gekürzt.
  • In der hive(beeline)-Befehlszeile sind die folgenden Einstellungen zu setzen, die explizit den Kompressionscodec festlegen und hive zwingen, die von hive geschriebene Parkettdatei zu komprimieren.

SET hive.exec.compress.output=true;

SET parquet.compression=SNAPPY

  • Ich habe die gleiche Menge an Daten eingefügt. Diesmal wurden ca. 350 MB an Parquet-Dateien erzeugt.
  • Auch hier wurde die Datei von hdfs nach lokal kopiert, um sie mit dem Dienstprogramm parquet-meta zu dumpen.

Auszug aus dem Parquet-meta dump
  • Hier können wir das sehen, es zeigt, dass die Datei mit SNAPPY zusammen mit der Kodierung komprimiert ist. Wenn wir die Komprimierung explizit aktivieren, wird die Größe der Parkettdatei bei gleicher Datenmenge als Ergebnis der Komprimierung erheblich reduziert.

Die Beobachtung ist also, dass Kodierung und Komprimierung unterschiedlich sind und getrennt oder zusammen verwendet werden können. Ich habe beobachtet, dass in Hive (ab CDH 5.14) beim Schreiben in eine Parquet-Tabelle standardmäßig nur die Kodierung und nicht die Komprimierung verwendet wird. Um die Komprimierung in Hive zu aktivieren, müssen wir dies explizit in Hive wie folgt einstellen.

SET hive.exec.compress.output=true;

SET parquet.compression=<Compression Codec>

Das Ergebnis wäre dann fast die gleiche Größe wie die der Impala-Inserts (Impala führt standardmäßig sowohl Kodierung als auch Komprimierung durch).

Eine Antwort schreiben

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.