Blog
Apache Avro - Ein System zur Serialisierung von Daten

In meinen früheren Beiträgen habe ich über Daten aus einer übergeordneten Perspektive gesprochen. Dieses Mal werden wir uns ein System zur Serialisierung von Daten namens Apache Avro ansehen.
Einführung in den Apache Avro
Apache Avro wurde von Doug Cutting, dem Schöpfer von Hadoop, Lucene und Nutch, speziell als offenes Datenserialisierungssystem entwickelt. Apache Avro wird von Datenverarbeitungssystemen wie Hadoop, Spark und Kafka verwendet und ist das De-facto-Datenserialisierungssystem für Datenverarbeitungssysteme mit hohem Volumen, hoher Leistung und hohem Durchsatz.
Eigenschaften
Apache Avro ist ein System zur Serialisierung von Daten, das Funktionen wie diese bietet:
- Bindungen für Programmiersprachen: Avro unterstützt Sprachbindungen für C, C++, C#, Go, Haskell, Java, Perl, PHP, Python, Ruby, Scala, TypeScript und mehr,
- Daten-Strukturen: Ein umfangreicher Satz von Datenstrukturen, die zum Schreiben von Daten verwendet werden können,
- Binäres Datenformat: Ein schnelles und kompaktes binäres Datenformat,
- Container Format: Eine Containerdatei zum Speichern und Aufbewahren von Daten,
- RPC: Remote Procedure Calls (RPC),
- Schema-Definitionen: Sprachunabhängiges Schema-Definitionsformat.
Die wichtigsten Funktionen
Das Tolle an Avro ist, dass es wie ein Toolkit verwendet werden kann. Da wir uns auf die Kernfunktion von Apache Avro, das Serialisierungssystem, konzentrieren werden, werden wir uns mit den folgenden Funktionen beschäftigen:
- Bindungen an Programmiersprachen,
- Daten-Strukturen,
- Binäres Datenformat,
- Schema-Definitionen
Bindungen an Programmiersprachen
Apache Avro bietet Sprachbindungen für C, C++, C#, Go, Haskell, Java, Perl, PHP, Python, Ruby, Scala, TypeScript und mehr. Die Referenzimplementierung von Avro wird als Java-Bibliothek entwickelt und veröffentlicht. Obwohl es möglich ist, Datentransformationen mit der Programmiersprache Java zu schreiben, ist eine andere Sprache auf der JVM viel besser geeignet. Die Programmiersprache Scala wurde mit Blick auf Datentransformationen entwickelt. Zur Unterstützung der Deklaration von Datentransformationspipelines unterstützt Scala ein sehr prägnantes Funktionsliteral und Transformationsprimitive wie die Klasse Type, die es sehr einfach machen, Daten von einer Darstellung in eine andere zu transformieren, und zwar auf eine sehr einfache und prägnante Weise. Für diesen Blog werden wir die Apache Avro Java-Referenzimplementierung und die Apache Avro-Typklassenbibliothek für Scala namens Avro4s verwenden.
Daten-Strukturen
Um Datenstrukturen zu serialisieren, benötigen Sie eine Strategie zur Definition von Datenstrukturen mithilfe von Typen. Avro unterstützt primitive Typen, logische Typen und komplexe Typen. | Typ | Instanzen | | --- | --- | | primitiver Typ | null, boolean, int, long, float, double, byte, string | | logischer Typ | decimal, date, time_ms, timestamp_ms | | komplexer Typ | record, enum, array, map, union, fixed. |
Was sind Schemata?
Schemas definieren die Struktur, den Typ und die Bedeutung (durch Dokumentation) von Daten. Mit Hilfe von Schemata können Datenkonsumenten die von Datenproduzenten produzierten Daten verstehen. Durch Schemata werden andere Konzepte wie Schema-Evolution und faule Datenumwandlung möglich.
Trennen Sie Daten und Schema
Apache Avro trennt Schemas vom serialisierten Format. Die Trennung der Schemas vom serialisierten Format bietet die Möglichkeit, sowohl das serialisierte Format als auch das Schemaformat zu optimieren. Das Avro-Serialisierungsformat wurde so optimiert, dass es so kompakt und schnell wie möglich ist. Das Schemaformat wurde so optimiert, dass es sprachunabhängig ist, gespeichert, indiziert und für die Suche zur Verfügung gestellt werden kann und die Daten mithilfe eines umfangreichen Typensystems beschreibt, das kontextbezogene Informationen in Form einer Dokumentation ermöglicht.
Ein flexibles Datensystem
Die Trennung von Schema und Daten bietet die Möglichkeit, über Daten in mehreren Dimensionen nachzudenken. Eine Dimension ist die Serialisierung von Daten in ihrer elementarsten Form, ohne weitere Informationen außer den Daten selbst. Die andere Dimension ist die Verfügbarkeit eines Schemakatalogs, der alle Definitionen aus allen Domänen enthält. Der Datenkatalog ist indiziert, wird laufend aktualisiert, ist durchsuchbar und wird allen Datenakteuren zur Verfügung gestellt. Die Beteiligten können den Datenkatalog nutzen, um sich über die Datenbereiche zu informieren, zu erkunden, was verfügbar ist, und gegebenenfalls mit der Nutzung von Datenprodukten zu beginnen.
Schema Format
Avro-Schemata werden in JSON definiert. Avro-Schemata können in einem Datenspeicher gespeichert und sowohl vom Datenproduzenten als auch vom Datenkonsumenten verwendet werden.
Avro Rekord Typ
Apache Avro unterstützt viele Typen, aber der Typ, der am häufigsten verwendet wird, ist der Typ 'Record'. Der Record-Typ ist nützlich für die Beschreibung komplexer Typen mit verschachtelten Beziehungen. Domäneneinheiten werden mit Avro-Datensätzen beschrieben.
Muster für die Schema-Entwicklung
Schema-Evolution ist eine Datenverwaltungsstrategie, die die Entwicklung eines Schemas im Laufe der Zeit ermöglicht. Wenn eine Schema-Evolution-Strategie vorhanden ist, können nachgelagerte Verbraucher alte, aktuelle und zukünftige Schemata nahtlos nutzen. Es gibt drei Evolutionsmuster: | Muster | Definition | | --- | --- | | Rückwärtskompatibel | Daten, die mit einem älteren Schema kodiert sind, können mit einem neueren Schema gelesen werden | | Vorwärtskompatibel | Daten, die mit einem neueren Schema kodiert sind, können mit einem älteren Schema gelesen werden | | Vollkompatibel | Alte Daten können mit einem neuen Schema und neue Daten mit einem alten Schema gelesen werden |
Daten entwerfen
Apache Avro ist ein System zur Datenserialisierung, das Primitive zur Serialisierung von Daten und zur Beschreibung von Daten bereitstellt. Apache Avro definiert nicht die Strategie zur Datenserialisierung, die für unsere Ziele geeignet ist. Abhängig von unserer Vision, unseren Zielen, unserem Ehrgeiz und unserer Kultur müssen wir ein Datenserialisierungssystem entwerfen, das zu dem passt, was wir erreichen wollen. Wenn vollständige Kompatibilität eine Anforderung ist, was bedeutet, dass Schemas sowohl rückwärts als auch vorwärts kompatibel sind, können wir unsere Schemas so entwerfen, dass sie es sind.
Das Schema ist unabhängig von den Daten
Jetzt, da wir wissen, dass Apache Avro Schema und Daten trennt, sehen wir etwas sehr Interessantes. Schemas sind unabhängig von Daten. Tatsächlich spielen Daten keine Rolle, wenn es um die Definition von Schemas geht. Schemas sind der wichtigste Teil der Arbeit mit Apache Avro. Bei Schemas dreht sich alles um Definitionen. So erfassen wir unsere Domänen. So definieren wir Entitäten, beschreiben, was sie bedeuten, und geben an, ob die Entität mit einem bestimmten Risiko verbunden ist oder nicht. Schemas bieten ein sehr reichhaltiges Vokabular, mit dem wir Domänen beschreiben können. Schemas sind außerdem erweiterbar, d.h. wir können unsere eigenen Definitionen definieren, die von anderen Schichten in unserem Datenserialisierungssystem verwendet werden können.
Unterstützung für Schema-Evolution
Apache Avro-Schemata erlauben Änderungen an einer Definition. Eine Domain-Entität wird sich im Laufe der Zeit oft ändern, und Apache Avro erlaubt Änderungen an einer Definition. Apache Avro wird mit der folgenden Schema-Evolution-Unterstützung geliefert. Je nach Anwendungsfall können Sie entscheiden, ob die von Avro bereitgestellte Evolutionsunterstützung für Ihren Zweck geeignet ist oder ob Sie Ihre eigene Evolutionsstrategie entwickeln wollen. Die meisten Datenplattformen bieten ihre eigene proprietäre Schema-Evolution-Engine. Die wichtigsten Auflösungsregeln von Apache Avro sind unten aufgeführt: | Schriftsteller | Leser | Aktion | | --- | --- | --- | | Reihenfolge der Datensatzfelder | Neuordnung der Felder | Felder werden nach Namen abgeglichen | | Definiert ein Feld | Entfernt ein Feld | Ignoriert das Feld | | kein Feld | neues Feld mit Standardwert | Standardwert verwenden | | Enum-Feld | muss vorhanden sein | sonst Fehler | | Liste des Typs | Liste des Typs muss übereinstimmen | sonst Fehler | | Karte des Typs | Karte des Typs muss übereinstimmen | sonst Fehler | | Typ und Größe müssen übereinstimmen | sonst Fehler | | Feld von int | long, float, double | promote | | Feld von long | float, double | promote | | Feld von float | double | promote | | Feld der Zeichenkette | Bytes | fördern | | Feld von Byte | String | Promotion |
Serialisieren und Deserialisieren
In Apache Avro gibt es zwei Parteien, die am Serialisierungssystem beteiligt sind. Der Writer produziert Daten und verwendet zum Zeitpunkt der Datenproduktion ein Schema. Dieses Schema wird als
Serialisierungsformate
Apache Avro unterstützt zwei Serialisierungsformate, die binäre Kodierung oder die JSON-Kodierung. Für eine leistungsstarke Verarbeitung großer Mengen ist die binäre Kodierung empfehlenswert.
Binäre Kodierungen
Apache Avro unterstützt zwei Binärkodierungen, die Single Object Encoding und die Raw Message Encoding. Die binär kodierten Rohdaten werden Avro Datum genannt und sind gemäß der Avro Binärkodierungsspezifikation kodiert. Die Single Object Encoding ist ein binärer Wrapper um die Avro Daten mit einer Identifikationsmarkierung und dem Fingerabdruck des Writer-Schemas. Das Single Object Encoding
Schema-Register
Apache Avro-Schemata werden über eine Schemaregistrierung sowohl für Schreiber als auch für Leser verfügbar gemacht. Datenverarbeitungssysteme, die Apache Avro verwenden, bieten genau wie Apache Kafka eine Schemaregistrierung. Die Schemaregistrierung bietet eine Serving-Schicht für Ihre Metadaten. Sie bietet eine Strategie zum Speichern und Abrufen von Avro-Schemata.
Fazit
In diesem Blog haben wir uns die Funktionen von Apache Avro, einem System zur Serialisierung von Daten, angesehen. Apache Avro ist das De-facto-Datenserialisierungssystem für Datenverarbeitungssysteme mit hohem Volumen, hoher Leistung und hohem Durchsatz wie Apache Kafka, Apache Hadoop und Apache Spark.
Verfasst von
Dennis Vriend
Unsere Ideen
Weitere Blogs
Contact



