AXV

Ma’lumot formatlari: Avro va formatlarni chuqur taqqoslash

Apache Avro, Schema Evolution va Katta to'rtlik (CSV, JSON, Parquet, Avro) tahlili

10-sinf BI va Machine Learning 2-hafta · 5-dars

Bugungi dars rejasi

Apache Avro nima?

Zich ikkilik (dense binary) qatorli format va nega u JSON'dan 5 barobar ixchamligi.

Schema Evolution

Sxema evolyutsiyasi: yangi ustunlar qo'shilganda tizimning uzluksiz ishlash siri.

Katta to'rtlik jangi

CSV vs JSON vs Parquet vs Avro — qachon qaysi formatni tanlash mezonlari.

01

Apache Avro formati

Qatorga asoslangan, o'ta ixcham ikkilik serializatsiya tizimi

Nega JSON oqimli tizimlarda qiynaladi?

JSON muammosi

{"id": 1, "user_id": 9942, "summa": 50000}
{"id": 2, "user_id": 9943, "summa": 12000}
{"id": 3, "user_id": 9944, "summa": 85000}

Har bir qatorda "id", "user_id", "summa" so'zlari million marta takrorlanadi! Tarmoq trafigi behuda to'ladi.

Avro yechimi

Sxema faqat bir marta (Header'da yoki Schema Registry'da) saqlanadi. Qatorlarda esa faqat zich ikkilik baytlar uzatiladi!

Natijada tarmoq orqali yuboriladigan hajm 70–80% ga qisqaradi.

Avro faylining tuzilishi

File Header (Fayl bosh qismi) 4 bayt: Magic "Obj\x01" File Schema (JSON formatidagi qat'iy sxema) 16 bayt: Sync marker Data Blocks (Siqilgan binar ma'lumotlar) Data Block 1 Yozuvlar soni + baytlar hajmi [Snappy/Deflate bilan siqilgan] Data Block 2 Yozuvlar soni + baytlar hajmi [Snappy/Deflate bilan siqilgan] Keyingi bloklar... Har bir blok oxirida Sync marker
02

Schema Evolution nima?

Dasturlar yangilanganda ma'lumotlar oqimini to'xtatmaslik san'ati

Moslik turlari (Compatibility Modes)

Backward

Yangi sxema yordamida eski yozuvlarni o'qish mumkin. Yangi maydonga default qiymat berilsa yetarli.

Forward

Eski sxema yordamida yangi yozuvlarni o'qish mumkin. Yangi maydonlar e'tiborsiz qoldiriladi.

Full Compatibility

Ham backward, ham forward moslik. Tizimning istalgan versiyasi istalgan ma'lumotni xatosiz o'qiydi.

Sxema evolyutsiyasi arxitekturasi

Producer V1 (Eski) Sxema: [id, ism, narx] Producer V2 (Yangi) Sxema: [id, ism, narx, chegirma] Apache Kafka Ikkala versiyadagi xabarlar bir oqimda [Binar ixcham paket] Consumer (Qabul qiluvchi) Schema Registry orqali xatosiz o'qiydi!
03

Katta to'rtlik: Formatlar taqqoslashi

CSV, JSON, Parquet va Avro — qachon qaysi birini ishlatamiz?

Katta to'rtlik xususiyatlari

CSV

Turi: Satrli matn

Sxema: Yo'q

Afzalligi: Oddiy, Excel'da ochiladi

Kichik eksportlar uchun

JSON

Turi: Satrli nested

Sxema: Ixtiyoriy

Afzalligi: Web va API standarti

Konfiguratsiya va loglar

Parquet

Turi: Ustunli binary

Sxema: Qat'iy ichki

Afzalligi: Analitika, Pushdown

DWH, Data Lake (Silver/Gold)

Avro

Turi: Satrli binary

Sxema: JSON sxema

Afzalligi: Tez yozish, Evolution

Kafka, Streaming, Ingestion

Qachon Parquet, qachon Avro?

Parquet (OLAP)

  • O'qish operatsiyalari ko'p (Read-heavy)
  • Katta jadvallarda aggregatsiya (`SUM`, `AVG`)
  • Faqat bir nechta ustun kerak bo'ladi
  • BI hisobotlari va Data Warehouse

Avro (OLTP / Streaming)

  • Yozish operatsiyalari ko'p (Write-heavy)
  • Barcha ustunlar bitta qatorda to'liq kerak
  • Oqimli real-time voqealar (Events, Kafka)
  • ETL ning boshlang'ich qatlamlari (Bronze)
04

Amaliyot: Python'da Avro bilan ishlash

Fastavro kutubxonasi yordamida sxema tuzish va saqlash

Avro sxemasi yaratish (JSON schema)

import fastavro

# 1. Sxemani JSON formatida tavsiflaymiz
schema = {
    'doc': 'Maktab oquvchilari baholari',
    'name': 'OquvchiBaho',
    'namespace': 'uz.maktab.bi',
    'type': 'record',
    'fields': [
        {'name': 'id', 'type': 'int'},
        {'name': 'ism', 'type': 'string'},
        {'name': 'baho', 'type': 'int'},
        # Ixtiyoriy maydon (Schema Evolution uchun default shart!)
        {'name': 'izoh', 'type': ['null', 'string'], 'default': None}
    ]
}
parsed_schema = fastavro.parse_schema(schema)

Avro fayliga yozish va o'qish

# 2. Saqlash uchun ma'lumotlar
records = [
    {'id': 1, 'ism': 'Ali Aliyev', 'baho': 95, 'izoh': "A'lo"},
    {'id': 2, 'ism': 'Vali Valiyev', 'baho': 82, 'izoh': None}
]

# 3. Faylga yozamiz (Snappy siqish bilan)
with open('data/oquvchilar.avro', 'wb') as out:
    fastavro.writer(out, parsed_schema, records, codec='snappy')

# 4. Faylni o'qiymiz
with open('data/oquvchilar.avro', 'rb') as f:
    reader = fastavro.reader(f)
    print("Sxema:", reader.writer_schema['name'])
    for r in reader:
        print(r['ism'], "->", r['baho'])

Interaktiv terminlar: Bosing va ko'ring

Schema Evolution nima?

Bosing va bilib oling

Yangi ustun qo'shilganda yoki eskilari o'chirilganda, eski va yangi dasturlar o'rtasidagi uzluksiz moslikni ta'minlash qobiliyati.

Schema Registry nima?

Bosing va bilib oling

Kafka ekotizimida barcha Avro sxemalarini markaziy saqlovchi server. Xabarlarda faqat 4 baytlik ID raqam yuboriladi.

Bilimingizni sinab ko'ring

Nima uchun Apache Kafka va real-time oqimlarida Parquet o'rniga Avro formati keng qo'llaniladi?

To'g'ri! Parquet ustunli bloklarni yig'ib siqishi kerak, Avro esa qatorlarni birma-bir oqimli yozish uchun maxsus yaratilgan.

Amaliy topshiriq: 3 daraja

1-daraja: Oson

5 ta maydondan iborat Avro sxemasini JSON formatida yozing va sintaksisini tekshiring.

10 daqiqa

2-daraja: O'rta

10 000 ta yozuvni JSON va Avro formatida saqlab, hajm farqini konsolga chiqaring.

15 daqiqa

3-daraja: Qiyin

Mavjud Avro faylini yangi ixtiyoriy maydon qo'shilgan yangi sxema bilan o'qib, moslikni isbotlang.

20 daqiqa

Dars xulosasi

  • Apache Avro — qatorga asoslangan (Row-based), zich ikkilik saqlash va serializatsiya standarti.
  • Schema Evolution orqali tizimlar yangilanganda ham ma'lumotlar oqimi to'xtamaydi.
  • Parquet vs Avro: Parquet — tahliliy so'rovlar (OLAP) qiroli, Avro — oqimli ma'lumotlar va yozish (Streaming/Kafka) yetakchisi.
  • Keyingi dars: Ma'lumotlar bazalari: konsept va tuzilma. Relatsion ma’lumotlar bazasi (RDBMS) asoslari!