Ich führe einige Tests mit den mit Hive verfügbaren Speicherformaten durch und verwende Parkett und ORC als Hauptoptionen. Ich habe ORC einmal mit Standardkomprimierung und einmal mit Snappy aufgenommen.
Ich habe viele Dokumente gelesen, in denen angegeben ist, dass Parkett im Vergleich zu ORC eine bessere zeitliche / räumliche Komplexität aufweist, aber meine Tests stehen im Gegensatz zu den Dokumenten, die ich durchlaufen habe.
Folgt einigen Details meiner Daten.
Table A- Text File Format- 2.5GB
Table B - ORC - 652MB
Table C - ORC with Snappy - 802MB
Table D - Parquet - 1.9 GB
Parkett war am schlimmsten, was die Komprimierung meines Tisches betrifft.
Meine Tests mit den obigen Tabellen ergaben folgende Ergebnisse.
Zeilenzähloperation
Text Format Cumulative CPU - 123.33 sec
Parquet Format Cumulative CPU - 204.92 sec
ORC Format Cumulative CPU - 119.99 sec
ORC with SNAPPY Cumulative CPU - 107.05 sec
Summe einer Spaltenoperation
Text Format Cumulative CPU - 127.85 sec
Parquet Format Cumulative CPU - 255.2 sec
ORC Format Cumulative CPU - 120.48 sec
ORC with SNAPPY Cumulative CPU - 98.27 sec
Durchschnitt einer Spaltenoperation
Text Format Cumulative CPU - 128.79 sec
Parquet Format Cumulative CPU - 211.73 sec
ORC Format Cumulative CPU - 165.5 sec
ORC with SNAPPY Cumulative CPU - 135.45 sec
Auswählen von 4 Spalten aus einem bestimmten Bereich mit der where-Klausel
Text Format Cumulative CPU - 72.48 sec
Parquet Format Cumulative CPU - 136.4 sec
ORC Format Cumulative CPU - 96.63 sec
ORC with SNAPPY Cumulative CPU - 82.05 sec
Bedeutet das, dass ORC schneller ist als Parkett? Oder gibt es etwas, das ich tun kann, damit es mit der Antwortzeit der Abfrage und dem Komprimierungsverhältnis besser funktioniert?
Vielen Dank!
Antworten:
Ich würde sagen, dass beide Formate ihre eigenen Vorteile haben.
Parkett ist möglicherweise besser, wenn Sie stark verschachtelte Daten haben, da es seine Elemente wie Google Dremel als Baum speichert ( siehe hier ).
Apache ORC ist möglicherweise besser, wenn Ihre Dateistruktur reduziert ist.
Und soweit ich weiß, unterstützt Parkett noch keine Indizes. ORC wird mit einem leichten Index geliefert und seit Hive 0.14 mit einem zusätzlichen Bloom-Filter, der hilfreich sein kann, um die Antwortzeit für Abfragen zu verbessern, insbesondere wenn es um Summenoperationen geht.
Die Parkett-Standardkomprimierung ist SNAPPY. Enthalten Tabelle A - B - C und D denselben Datensatz? Wenn ja, sieht es so aus, als ob etwas Schattiges daran ist, wenn es nur auf 1,9 GB komprimiert wird
quelle
Sie sehen dies, weil:
Hive hat einen vektorisierten ORC-Leser, aber keinen vektorisierten Parkettleser.
Spark hat einen vektorisierten Parkettleser und keinen vektorisierten ORC-Leser.
Spark funktioniert am besten mit Parkett, Hive am besten mit ORC.
Ich habe ähnliche Unterschiede beim Ausführen von ORC und Parkett mit Spark gesehen.
Vektorisierung bedeutet, dass Zeilen stapelweise dekodiert werden, wodurch die Speicherlokalität und die Cache-Auslastung erheblich verbessert werden.
(korrekt ab Hive 2.0 und Spark 2.1)
quelle
Sowohl Parkett als auch ORC haben ihre eigenen Vor- und Nachteile. Aber ich versuche einfach, einer einfachen Faustregel zu folgen: "Wie verschachtelt sind Ihre Daten und wie viele Spalten sind vorhanden?" . Wenn Sie dem Google Dremel folgen , können Sie herausfinden, wie Parkett gestaltet ist. Sie verwenden eine hierarchische baumartige Struktur zum Speichern von Daten. Je mehr der Baum tiefer nistet.
Aber ORC ist für eine abgeflachte Dateispeicher konzipiert. Wenn Ihre Daten also mit weniger Spalten abgeflacht sind, können Sie sich für ORC entscheiden. Andernfalls ist Parkett für Sie in Ordnung. Die Komprimierung von abgeflachten Daten funktioniert in ORC erstaunlich gut.
Wir haben ein Benchmarking mit einer größeren abgeflachten Datei durchgeführt, diese in Spark Dataframe konvertiert und in S3 sowohl im Parkett- als auch im ORC-Format gespeichert und mit ** Redshift-Spectrum ** abgefragt .
In Kürze werden wir ein Benchmarking für verschachtelte Daten durchführen und die Ergebnisse hier aktualisieren.
quelle
Wir haben einige Benchmarks durchgeführt, um die verschiedenen Dateiformate (Avro, JSON, ORC und Parkett) in verschiedenen Anwendungsfällen zu vergleichen.
https://www.slideshare.net/oom65/file-format-benchmarks-avro-json-orc-parquet
Die Daten sind alle öffentlich verfügbar und der Benchmark-Code ist Open Source unter:
https://github.com/apache/orc/tree/branch-1.4/java/bench
quelle
Beide haben ihre Vorteile. Wir verwenden Parkett bei der Zusammenarbeit mit Hive und Impala, wollten jedoch nur einige Vorteile von ORC gegenüber Parkett hervorheben: Bei Abfragen mit langer Laufzeit , wenn Hive ORC-Tabellen abfragt, wird GC etwa zehnmal seltener aufgerufen . Könnte für viele Projekte nichts sein, könnte aber für andere von entscheidender Bedeutung sein.
ORC benötigt auch viel weniger Zeit, wenn Sie nur wenige Spalten aus der Tabelle auswählen müssen. Einige andere Abfragen, insbesondere bei Joins, benötigen aufgrund der vektorisierten Abfrageausführung, die für Parkett nicht verfügbar ist, ebenfalls weniger Zeit
Außerdem ist die ORC-Komprimierung manchmal etwas zufällig, während die Parkettkomprimierung viel konsistenter ist. Es sieht so aus, als hätte die ORC-Tabelle viele Zahlenspalten - sie wird auch nicht komprimiert. Dies wirkt sich sowohl auf die zlib- als auch auf die bissige Komprimierung aus
quelle