Blog
Apache Avro - Lassen Sie uns mit Code praktisch werden

In meinen vorherigen Beiträgen habe ich über Daten aus einer übergeordneten Perspektive gesprochen und Apache Avro, ein System zur Serialisierung von Daten, vorgestellt. Diesmal werden wir Apache Avro in die Praxis umsetzen und uns Schemas ansehen
Einführung in die Domain
Wir brauchen eine Domain, und da dies ein Blog ist, sollten wir die Domain einfach halten. Lassen Sie uns eine Domain erstellen, die aus einer einzigen Personentität besteht. Die Entität Person wird sich im Laufe der Zeit ändern und wir werden drei Versionen haben. Die erste Version, v1.Person, hat ein einziges Namensfeld. In v2.Person haben wir ein Altersfeld hinzugefügt. In v3.Person haben wir die Reihenfolge der Felder geändert. Wir können diese Domäne in Scala wie folgt deklarieren:
case class v1.Person(name: String = "")
case class v2.Person(name: String = "", age: Int = 0)
case class v3.Person(age: Int = 0, name: String = "")
Avro Schemata
Apache Avro-Schemadefinitionen werden im JSON-Format deklariert. Wenn wir Schemas aus diesen Fallklassen generieren, erhalten wir die folgenden Avro-Schemas.
v1.Person:
{
"type" : "record",
"name" : "Person",
"namespace" : "binxio",
"fields" : [ {
"name" : "name",
"type" : "string",
"default" : ""
} ]
}
v2.Person:
{
"type" : "record",
"name" : "Person",
"namespace" : "binxio",
"fields" : [ {
"name" : "name",
"type" : "string",
"default" : ""
}, {
"name" : "age",
"type" : "int",
"default" : 0
} ]
}
v3.Person:
{
"type" : "record",
"name" : "Person",
"namespace" : "binxio",
"fields" : [ {
"name" : "age",
"type" : "int",
"default" : 0
}, {
"name" : "name",
"type" : "string",
"default": ""
} ]
}
Serialisierung
Wenn wir einen Datensatz in Avro serialisieren, erhalten wir die folgenden Avro Datumsangaben. Wir stellen die Avro Datumsangaben als hexadezimale Zeichenketten dar. Sie können sehen, dass der Name 'Dennis' als '0C44656E6E6973' kodiert ist. Die Zahl '42' wird aufgrund der Zick-Zack-Kodierung als '54' kodiert.
v1.Person:
v1.Person("Dennis").toAvroBinary().hex
"0C44656E6E6973"
v2.Person:
v2.Person("Dennis", 42).toAvroBinary().hex
"0C44656E6E697354"
v3.Person:
v3.Person(42, "Dennis").toAvroBinary().hex
"540C44656E6E6973"
Deserialisieren
Wenn wir ein Avro Datum deserialisieren, müssen wir das Writer- und das Reader-Schema angeben.
v1.Person:
"0C44656E6E6973".parseAvroBinary[v1.Person, v1.Person]
v1.Person("Dennis")
v2.Person:
"0C44656E6E697354".parseAvroBinary[v2.Person, v2.Person]
v2.Person("Dennis", 42)
v3.Person:
"540C44656E6E6973".parseAvroBinary[v3.Person, v3.Person]
v3.Person(42, "Dennis")
Schema-Entwicklung
Die Schemas, die wir definiert haben, haben alle Standardwerte für Felder. Das bedeutet, dass die Schemata vollständig kompatibel sind. Das Avro Datum ist mit v1.Person geschrieben. Wenn wir dem System mitteilen, dass wir eine andere Darstellung wünschen, berechnet Avro die Schemaentwicklung und stellt die gewünschte Schemaversion zur Verfügung.
Schreiber: v1.Person => Leser: v2.Person:
"0C44656E6E6973".parseAvroBinary[v2.Person, v1.Person]
v2.Person("Dennis", 0)
Schreiber: v1.Person => Leser: v3.Person:
"0C44656E6E6973".parseAvroBinary[v3.Person, v1.Person]
v3.Person(0, "Dennis")
Schreiber: v3.Person => Leser: v1.Person:
"540C44656E6E6973".parseAvroBinary[v1.Person, v3.Person]
v1.Person("Dennis")
Schreiber: v3.Person => Leser: v2.Person:
"540C44656E6E6973".parseAvroBinary[v2.Person, v3.Person]
v2.Person("Dennis", 42)
Schreiber: v4.Person => Leser: v1.Person:
"540C44656E6E697302021
C4C61617065727376656C64
203237021248696C7665727
3756D020E31323133205642".parseAvroBinary[v1.Person, v4.Person]
v1.Person("Dennis")
Bereichsübergreifende Entwicklung
Apache Avro kann Schemata bei Bedarf domänenübergreifend weiterentwickeln.
Schreiber: v1.Person => Leser: v1.Cat:
"0C44656E6E6973".parseAvroBinary[v1.Cat, v1.Person]
v1.Cat("Dennis")
Anscheinend bin ich auch eine Katze!
Fazit
In diesem Blog haben wir eine einfache Domäne erstellt, Avro-Schemata für die Domäne erstellt, Datensätze in Avro-Datensätze serialisiert, Schemata entwickelt und sogar eine domänenübergreifende Evolution durchgeführt. In diesem Blog haben wir Scala, eine Programmiersprache für die JVM, verwendet, um die Beispiele zu zeigen. Apache Avro unterstützt Sprachbindungen für C, C++, C#, Go, Haskell, Java, Perl, PHP, Python, Ruby, Scala, TypeScript und mehr. Die Avro Datums, die wir in diesem Blog generiert haben, können auch von anderen Systemen gelesen werden, da Apache Avro ein offenes Datenserialisierungssystem ist. Apache Avro wird von Datenverarbeitungssystemen mit hohem Volumen, hoher Leistung und hohem Durchsatz wie Apache Kafka, Apache Hadoop und Apache Spark verwendet.
Verfasst von
Dennis Vriend
Unsere Ideen
Weitere Blogs
Contact



