Eigenschaften von Apache Parkett sind:
- Selbstbeschreibend
- Spaltenformat
- Sprachunabhängig
Im Vergleich zu Avro, Sequence Files, RC File etc. möchte ich einen Überblick über die Formate. Ich habe bereits gelesen: Wie Impala mit Hadoop-Dateiformaten funktioniert , gibt es einige Einblicke in die Formate, aber ich möchte wissen, wie der Zugriff auf Daten und die Speicherung von Daten in jedem dieser Formate erfolgt. Wie hat Parkett einen Vorteil gegenüber den anderen?
Antworten:
Ich denke, der Hauptunterschied, den ich beschreiben kann, betrifft datensatzorientierte und spaltenorientierte Formate. Datensatzorientierte Formate sind das, was wir alle gewohnt sind - Textdateien, begrenzte Formate wie CSV, TSV. AVRO ist etwas cooler als diese, da es das Schema im Laufe der Zeit ändern kann, z. B. das Hinzufügen oder Entfernen von Spalten zu einem Datensatz. Andere Tricks verschiedener Formate (insbesondere einschließlich Komprimierung) betreffen die Frage, ob ein Format aufgeteilt werden kann. Können Sie also einen Datensatzblock von einer beliebigen Stelle im Dataset aus lesen und trotzdem wissen, ob es sich um ein Schema handelt? Hier finden Sie weitere Informationen zu Spaltenformaten wie Parkett.
Parkett und andere Säulenformate bewältigen eine häufige Hadoop-Situation sehr effizient. Es ist üblich, dass Tabellen (Datasets) viel mehr Spalten enthalten, als Sie in einer gut gestalteten relationalen Datenbank erwarten würden - hundert oder zweihundert Spalten sind nicht ungewöhnlich. Dies liegt daran, dass wir Hadoop häufig als Ort verwenden, um Daten aus relationalen Formaten zu denormalisieren. Ja, Sie erhalten viele wiederholte Werte und viele Tabellen, die alle zu einer einzigen zusammengefasst sind. Das Abfragen wird jedoch viel einfacher, da alle Verknüpfungen ausgearbeitet sind. Es gibt weitere Vorteile, z. B. das Beibehalten von Statusdaten. Es ist also sowieso üblich, eine Schiffsladung Spalten in einer Tabelle zu haben.
Nehmen wir an, es gibt 132 Spalten, und einige davon sind wirklich lange Textfelder, wobei jede Spalte nacheinander folgt und möglicherweise 10 KB pro Datensatz verbraucht.
Während das Abfragen dieser Tabellen unter SQL-Gesichtspunkten einfach ist, möchten Sie häufig eine Reihe von Datensätzen abrufen, die nur auf wenigen dieser über hundert Spalten basieren. Beispielsweise möchten Sie möglicherweise alle Datensätze im Februar und März für Kunden mit einem Umsatz von> 500 US-Dollar.
Um dies in einem Zeilenformat zu tun, müsste die Abfrage jeden Datensatz des Datensatzes scannen. Lesen Sie die erste Zeile, analysieren Sie den Datensatz in Felder (Spalten) und rufen Sie die Datums- und Verkaufsspalten ab. Fügen Sie ihn in Ihr Ergebnis ein, wenn er die Bedingung erfüllt. Wiederholen. Wenn Sie 10 Jahre (120 Monate) Geschichte haben, lesen Sie jede einzelne Aufzeichnung, um 2 dieser Monate zu finden. Natürlich ist dies eine großartige Gelegenheit, eine Partition für Jahr und Monat zu verwenden, aber trotzdem lesen und analysieren Sie 10.000 von jedem Datensatz / jeder Zeile für diese zwei Monate, um festzustellen, ob der Umsatz des Kunden> 500 US-Dollar beträgt.
In einem Spaltenformat wird jede Spalte (Feld) eines Datensatzes zusammen mit anderen seiner Art gespeichert und auf viele verschiedene Blöcke auf der Festplatte verteilt - Spalten für das Jahr zusammen, Spalten für den Monat zusammen, Spalten für das Handbuch für Kundenmitarbeiter (oder andere) Langtext) und all die anderen, die diese Datensätze so groß machen, alle an ihrem eigenen Platz auf der Festplatte und natürlich Spalten für den gemeinsamen Verkauf. Zum Teufel, Datum und Monate sind Zahlen, ebenso wie Verkäufe - sie sind nur ein paar Bytes. Wäre es nicht großartig, wenn wir nur ein paar Bytes für jeden Datensatz lesen müssten, um festzustellen, welche Datensätze zu unserer Abfrage passen? Säulenlagerung zur Rettung!
Selbst ohne Partitionen ist das Scannen der kleinen Felder, die zur Erfüllung unserer Anfrage benötigt werden, superschnell - sie sind alle nach Datensätzen geordnet und alle gleich groß, sodass die Festplatte nach viel weniger Daten sucht, um nach enthaltenen Datensätzen zu suchen. Sie müssen dieses Mitarbeiterhandbuch und andere Langtextfelder nicht durchlesen - ignorieren Sie sie einfach. Wenn Sie also Spalten anstelle von Zeilen gruppieren, können Sie fast immer weniger Daten scannen. Sieg!
Aber warte, es wird besser. Wenn Ihre Abfrage nur diese und einige weitere Werte kennen musste (sagen wir 10 der 132 Spalten) und sich nicht um diese Spalte des Mitarbeiterhandbuchs kümmerte, musste sie nur noch gehen, nachdem sie die richtigen Datensätze für die Rückgabe ausgewählt hatte Zurück zu den 10 Spalten, die zum Rendern der Ergebnisse benötigt wurden, wobei die anderen 122 der 132 in unserem Datensatz ignoriert wurden. Auch hier überspringen wir viel Lesen.
(Hinweis: Aus diesem Grund sind Spaltenformate eine schlechte Wahl, wenn Sie gerade Transformationen durchführen. Wenn Sie beispielsweise alle zwei Tabellen zu einer großen (ger) Ergebnismenge zusammenfügen, die Sie als neue Tabelle speichern, die Quellen werden sowieso vollständig gescannt, daher bietet die Leseleistung keinen großen Vorteil. Da sich Spaltenformate mehr über den Speicherort erinnern müssen, verwenden sie mehr Speicher als ein ähnliches Zeilenformat.
Ein weiterer Vorteil von columnar: Daten werden verteilt. Um einen einzelnen Datensatz zu erhalten, können 132 Mitarbeiter Daten von / an 132 verschiedenen Stellen in 132 Datenblöcken lesen (und schreiben). Ja für die Parallelisierung!
Und jetzt zum Drahtreifen: Komprimierungsalgorithmen funktionieren viel besser, wenn sie sich wiederholende Muster finden. Sie könnten komprimieren
AABBBBBBCCCCCCCCCCCCCCCC
wie2A6B16C
aberABCABCBCBCBCCCCCCCCCCCCCC
würde sich nicht so klein (na ja, eigentlich, in diesem Fall wäre es, aber glauben Sie mir :-)). Also noch einmal weniger lesen. Und auch schreiben.Wir lesen also viel weniger Daten, um häufig gestellte Fragen zu beantworten. Das parallele Lesen und Schreiben ist möglicherweise schneller, und die Komprimierung funktioniert in der Regel viel besser.
Columnar ist großartig, wenn Ihre Eingabeseite groß ist und Ihre Ausgabe eine gefilterte Teilmenge ist: von groß nach klein ist großartig. Nicht so vorteilhaft, wenn die Ein- und Ausgänge ungefähr gleich sind.
In unserem Fall hat Impala unsere alten Hive-Abfragen beantwortet, die in 5, 10, 20 oder 30 Minuten ausgeführt wurden und in wenigen Sekunden oder einer Minute abgeschlossen wurden.
Ich hoffe, dies hilft, zumindest einen Teil Ihrer Frage zu beantworten!
quelle
Avro ist ein zeilenbasiertes Speicherformat für Hadoop.
Parkett ist ein spaltenbasiertes Speicherformat für Hadoop.
Wenn Ihr Anwendungsfall normalerweise alle Felder in einer Zeile in jeder Abfrage scannt oder abruft, ist Avro normalerweise die beste Wahl.
Wenn Ihr Dataset viele Spalten enthält und Ihr Anwendungsfall normalerweise die Arbeit mit einer Teilmenge dieser Spalten und nicht mit ganzen Datensätzen umfasst, ist Parkett für diese Art von Arbeit optimiert.
Quelle
quelle
Toms Antwort ist ziemlich detailliert und vollständig, aber Sie könnten auch an dieser einfachen Studie über Parkett gegen Avro interessiert sein , die bei Allstate Insurance durchgeführt wurde und hier zusammengefasst ist:
"Insgesamt zeigte Parkett bei jedem Test ähnliche oder bessere Ergebnisse [als Avro]. Die Unterschiede in der Abfrageleistung bei den größeren Datensätzen zugunsten von Parkett sind teilweise auf die Komprimierungsergebnisse zurückzuführen. Bei der Abfrage des breiten Datensatzes musste Spark das 3,5-fache lesen weniger Daten für Parkett als für Avro. Avro hat bei der Verarbeitung des gesamten Datensatzes, wie vermutet, keine gute Leistung erbracht. "
quelle