Blog

Apache Avro - Ein System zur Serialisierung von Daten

Dennis Vriend

Aktualisiert Oktober 21, 2025
9 Minuten

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 Writer-Schema bezeichnet, weil es das Schema ist, das der Writer bei der Serialisierung der Daten verwendet hat. Die andere Partei ist der Leser, der die Daten konsumiert. Der Leser kann jedes beliebige Schema verwenden, auch Schemata aus einer ganz anderen Domäne. Nehmen wir an, er verwendet genau dasselbe Schema, das der Writer zum Lesen der Daten verwendet hat. Das Schema, das der Reader verwendet, wird als Reader Schema bezeichnet. Das Apache Avro Serialisierungssystem enthält eine Delta Engine. Die Engine benötigt das Schema des Writers und des Readers, um zu bestimmen, welche Datenumwandlung vorgenommen werden muss, damit die Daten in das Schema des Readers passen. Dies wird als Schema beim Lesen bezeichnet. Das Ergebnis ist ein Datenprodukt, das der Leser konsumieren kann. Das System kann die Daten dann verwenden, um sie in einen Datensatz zur Verarbeitung umzuwandeln. Wenn es sich bei der Programmiersprache um Scala handelt, erstellen Sie daraus meist eine Fallklasse.

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 versieht Avro Datum mit einem Fingerabdruck des Writer Schemas. Ein Leser kann anhand des Fingerabdrucks das Schema des Writers nachschlagen, um die Avro Daten zu deserialisieren.

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.Apache Avro kann so zugeschnitten werden, dass es ein Datenserialisierungssystem bietet, das zu unserer Vision, unseren Zielen, unserem Ehrgeiz, unserer Kultur und dem, was wir erreichen wollen, passt. Apache Avro trennt das Schema von den Daten und ermöglicht so eine hochflexible Strategie für die Schemaentwicklung. Da wir die Daten in ihrer elementarsten Form zur Verfügung haben, können wir sie transformieren und Identifizierungs-Wrapper zu den Daten hinzufügen, wie z.B. das Single Object Encoding, aber auch Datensicherheits-Wrapper, die auf Feld-Ebene eingesetzt werden können. Beim nächsten Mal werden wir uns ansehen, wie wir mit Apache Avro arbeiten können, wie wir Daten serialisieren und deserialisieren und wie die Schemas und die binäre Kodierung im Code aussehen.

Verfasst von

Dennis Vriend

Contact

Let’s discuss how we can support your journey.