Bosh sahifa Wiki Avro

Avro

Avro — ma’lumotlarni schema asosida binary yoki JSON ko‘rinishda serialize qilishga mo‘ljallangan tizim. U Apache Hadoop ekotizimida paydo bo‘lgan va event streaming, data lake, batch processing hamda service communicationda keng qo‘llanadi. Avro schema’ni odatda JSON formatida ifodalaydi.

Avro’ning muhim xususiyati — writer schema va reader schema orasida compatibility qoidalari orqali turli versiyadagi producer hamda consumerlarni birgalikda ishlatish imkoniyati.

Schema

Avro schema JSON obyekt sifatida yoziladi:

{
  "type": "record",
  "name": "User",
  "fields": [
    {"name": "id", "type": "long"},
    {"name": "name", "type": "string"}
  ]
}

Schema record nomi, fieldlar va ularning turlarini belgilaydi.

Record

record bir nechta nomlangan fieldlardan tashkil topadi.

Field tartibi binary encodingda muhim bo‘lishi mumkin.

Har field:

kabi xususiyatlarga ega bo‘lishi mumkin.

Primitive turlar

Avro primitive turlari:

  • null;
  • boolean;
  • int;
  • long;
  • float;
  • double;
  • bytes;
  • string.

Murakkab turlar:

  • record;
  • enum;
  • array;
  • map;
  • union;
  • fixed.

Schema type’larni aniq belgilaydi.

Union

Avro union bir field bir nechta turdan biri bo‘lishini ko‘rsatadi:

["null", "string"]

Optional string ko‘pincha shu ko‘rinishda yoziladi.

Default qiymat union ichidagi birinchi type bilan mos bo‘lishi kerak.

Union ichida bir xil asosiy type’ni takrorlash mumkin emas.

Array va map

Array bir xil schema’dagi qiymatlar ro‘yxati:

{"type": "array", "items": "string"}

Map string key va bir xil value schema’dan tashkil topadi:

{"type": "map", "values": "long"}

Murakkab nested data shu turlar bilan ifodalanadi.

Enum

Enum oldindan belgilangan symbol ro‘yxatini beradi:

{
  "type": "enum",
  "name": "Status",
  "symbols": ["ACTIVE", "DISABLED"]
}

Yangi symbol qo‘shish consumer compatibility’siga ta’sir qilishi mumkin.

Reader noma’lum symbolni qanday boshqarishi schema va defaultga bog‘liq.

Fixed

fixed aniq byte uzunligidagi qiymatni ifodalaydi.

Masalan, hash yoki ma’lum formatdagi identifikator.

Oddiy bytes variable-length, fixed esa doimiy o‘lchamga ega.

Binary encoding

Avro binary payloadda field nomlarini har recordda takrorlamaydi.

Schema field tartibi va type’larni beradi.

Bu payloadni ixcham qiladi.

Parser data’ni to‘g‘ri o‘qish uchun writer schema’ni bilishi kerak.

Writer schema

Producer ma’lumotni qaysi schema bilan yozgan bo‘lsa, u writer schema hisoblanadi.

Binary recordni parse qilishda aynan shu schema kerak.

Schema file ichida, message metadata’da yoki external registryda saqlanishi mumkin.

Reader schema

Consumer ma’lumotni o‘qiyotganda o‘z schema’sidan foydalanishi mumkin.

Avro writer va reader schema’ni resolution qoidalari bilan moslashtiradi.

Masalan, reader yangi optional field qo‘shgan bo‘lsa default qiymat ishlatilishi mumkin.

Schema evolution

Compatibilityga mos o‘zgarishlar:

  • defaultli yangi field qo‘shish;
  • fieldni alias bilan rename qilish;
  • ayrim numeric promotion;
  • consumerga kerak bo‘lmagan fieldni o‘qimaslik.

Xavfli o‘zgarishlar:

  • required fieldni defaultsiz qo‘shish;
  • mos kelmaydigan type almashtirish;
  • enum symbolni olib tashlash;
  • nom va namespace’ni nazoratsiz o‘zgartirish.

Compatibility yo‘nalishlari

Schema registry yoki platforma quyidagi rejimlarni tekshirishi mumkin:

  • backward compatibility;
  • forward compatibility;
  • full compatibility;
  • transitive variantlar;
  • compatibility yo‘q.

Backward holatda yangi consumer eski data’ni o‘qiy oladi.

Forward holatda eski consumer yangi data’ni o‘qiy olishi ko‘zda tutiladi.

Object Container File

Avro Object Container File ko‘p recordni bitta faylda saqlaydi.

Fayl quyidagilarni o‘z ichiga olishi mumkin:

Bu data lake va batch processing uchun qulay.

Block va compression

Recordlar blocklarga guruhlanadi.

Har block alohida compression bilan yozilishi mumkin.

Compression schema-aware emas, encoded byte oqimiga qo‘llanadi.

Block structure parallel processing va splitlarga yordam beradi.

Schema Registry

Event streamingda schema markaziy registry’da saqlanishi mumkin.

Message ichida to‘liq schema o‘rniga schema ID beriladi.

Consumer ID orqali schema’ni oladi.

Registry compatibility policy va version tarixini boshqaradi.

Avro va Kafka

Kafka eventlari Avro bilan encode qilinishi mumkin.

Afzalliklar:

Kafka o‘zi Avro’ni majburiy talab qilmaydi.

Avro va Protobuf

Ikkalasi schema-based binary format.

Avro schema JSON ko‘rinishida va writer-reader resolutionga kuchli e’tibor beradi.

Protobuf field number va generated code’ga tayanadi.

Avro data pipeline va event ekotizimida, Protobuf RPC hamda typed service contractda keng uchraydi.

Security

Untrusted Avro data uchun:

  • block hajmi;
  • record soni;
  • nested depth;
  • string/bytes uzunligi;
  • compression ratio;
  • schema source;
  • logical type

cheklanadi.

External schema registry authentication va integrity bilan himoyalanadi.

Logical type

Primitive qiymat ustiga yuqori darajadagi semantika berish uchun logical type ishlatiladi. Masalan:

  • decimal;
  • date;
  • time;
  • timestamp;
  • UUIDga oid type.

Wire format primitive bo‘lib qoladi, ammo reader uni domain type’ga aylantiradi. Precision, scale va timezone qoidalari producer hamda consumerda bir xil bo‘lishi kerak.

Alias

Record yoki field nomi o‘zgarganda eski nom alias sifatida berilishi mumkin. Reader schema writerdagi eski nomni yangi fieldga map qiladi. Alias identityni butunlay o‘zgartirish emas, compatibility migration vositasidir.

Bog‘liq tushunchalar

Apache Avro, Schema, Record, Union, Writer schema, Reader schema, Schema evolution, Object Container File, Schema Registry, Kafka, Binary serialization