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:
- nom;
- type;
- default qiymat;
- documentation;
- alias
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