🎯 Definicja

Apache Avro to lekki, open-source’owy system serializacji danych stworzony przez Apache Software Foundation. Umożliwia wydajną i elastyczną wymianę danych między różnymi językami programowania i systemami obliczeniowymi, przy zachowaniu ścisłego schematu danych (schema definition). Avro bardzo dobrze integruje się z systemami przetwarzania danych takich jak Apache Kafka, Hadoop czy Spark.

🔑 Kluczowe punkty

  • Zbudowany w oparciu o schemat (schema): każde dane są powiązane z opisem struktury (metadata).
  • Kompaktowy i szybki format binarny, ale potrafi używać także JSON do reprezentacji schematu.
  • Wspiera wiele języków: Java, Python, C, C++, Go, Rust.
  • Doskonale sprawdza się w systemach strumieniowych – np. Kafka + Avro + Schema Registry.
  • Umożliwia dynamiczną obsługę schematów i ich ewolucję bez przerwy w obsłudze strumienia.

📚 Szczegółowe wyjaśnienie

Cechy techniczne:

  • Wiąże dane z ich schematem – każda porcja danych może zawierać kompletny schemat lub nagłówek wskazujący na zarejestrowany schemat.
  • Bezproblemowa serializacja i deserializacja – niezależna od języka (cross-language).
  • Ewolucja schematu (schema evolution) – można zmieniać schematy (dodawać pola, zmieniać typy) bez łamania zgodności wstecznej.
  • Brak klas generowanych kodem (jak np. w Avro vs Thrift vs Protobuf) – działa dynamicznie.
  • Optymalny rozmiar i szybkość dla Big Data i przesyłania strumieniowego.

Przykład schematu Avro (w JSON):

{
  "type": "record",
  "name": "User",
  "fields": [
    { "name": "id", "type": "int" },
    { "name": "name", "type": "string" },
    { "name": "email", "type": ["null", "string"], "default": null }
  ]
}

Przykład w Pythonie (z użyciem fastavro):

import fastavro
 
schema = {
    "type": "record",
    "name": "User",
    "fields": [
        {"name": "id", "type": "int"},
        {"name": "name", "type": "string"},
    ],
}
 
record = {"id": 1, "name": "Maria"}
 
with open("user.avro", "wb") as out:
    fastavro.writer(out, schema, [record])

Avro vs inne formaty

FormatRodzajSchematTypowy use-case
AvroBinarneTakKafka, Hadoop, streaming pipelines
JSONTekstowyNieAPI, debugowanie
ParquetKolumnowyTakHurtownie danych, analizy OLAP
ORCKolumnowyTakHive, optymalne dla dużych zapytań
Protobuf/ThriftBinarneTakRPC, komunikacja mikrousług

Dlaczego Avro?

  • Wydajna serializacja, kompaktowe formaty wysyłkowe
  • Idealny dla dużych systemów event-driven (Kafka, Pulsar)
  • Bezpieczny przy rozwoju – ewolucja schematu
  • Odczyt danych niezależnie od języka źródłowego

💡 Przykład zastosowania

Zespół wykorzystuje Apache Kafka do przyjmowania zdarzeń z aplikacji mobilnych, gdzie każde zdarzenie (log-in, zakup, sesja) kodowane jest jako Avro. Skonfigurowane Kafka Schema Registry umożliwia deserializację danych w Pythonie, Javy i SPARK bez martwienia się o zmiany schematów.

Takie podejście zapewnia spójność struktury danych, a także pozwala dynamicznie zarządzać ich ewolucją w czasie: np. dodając nowe pola bez łamania starszych konsumentów.

📌 Źródła

👽 Brudnopis

  • Avro = “lekki Parquet dla strumieni”
  • Brak schematu → seria identyfikatorów opartych o Schema Registry
  • Kompatybilność schematów → critical w long-lived systems
  • Wsparcie Kafka REST Endpoint z Avro
  • vs Protobuf: Avro bardziej dynamiczny, schemas jako JSON
  • Format preferred przez Kafka Connect, HDFS, Flink