Schema evolution на собеседовании Data Engineer
Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.
Содержание:
Зачем разбирать на собесе
Schema evolution — главный челлендж long-running pipelines. На собесе DE: «как добавить поле без поломки», «отличия compatibility», «зачем schema registry».
Backward, forward, full compatibility
Backward compatible. Новая schema может читать старые данные. (Новый код умеет старые сообщения.)
Forward compatible. Старая schema может читать новые данные. (Старый код умеет новые сообщения.)
Full compatibility. И backward и forward.
Что считается изменением:
- Add field with default → backward + forward (если default — корректно).
- Remove field → forward (старый код всё ещё умеет, игнорирует поле). Но может быть not backward.
- Rename field → break.
- Change type → обычно break (string → int точно).
- Make required → break.
В Schema Registry задаётся compatibility level — продьюсер не может зарегистрировать schema, нарушающую правило.
Schema evolution в Avro
Avro поддерживает evolution через writer schema + reader schema.
Add field with default:
// v1
{"type": "record", "fields": [{"name": "id", "type": "long"}]}
// v2 — добавили email с default
{"type": "record", "fields": [
{"name": "id", "type": "long"},
{"name": "email", "type": ["null", "string"], "default": null}
]}V1-данные читаются v2-кодом (email = null). V2-данные читаются v1-кодом (поле игнорируется).
Reorder fields — OK (Avro по имени, не позиции).
Remove non-default field — break backward.
Schema evolution в Parquet
Parquet — file format. Каждый файл имеет свою schema.
Поддерживает:
- Read новых файлов старым кодом — игнорирует unknown columns.
- Read старых файлов новым кодом — missing columns как NULL (если nullable).
Не поддерживает (без перезаписи):
- Rename column.
- Change type (всё, кроме compatible: int → long).
В Spark / dbt / Iceberg есть утилиты для эволюции (rename, type promotion).
Schema Registry (Confluent)
Centralized хранилище schemas для Kafka.
Workflow:
- Producer регистрирует schema.
- Registry проверяет compatibility с предыдущими версиями.
- Если OK — присваивает schema_id.
- Producer пишет в Kafka сообщение:
[magic byte][schema_id][avro/protobuf/json data]. - Consumer читает schema_id, fetches schema из registry, decodes сообщение.
Compatibility levels:
BACKWARD(default) — новая schema читает старые данные.BACKWARD_TRANSITIVE— backward с ВСЕМИ предыдущими, не только N-1.FORWARD,FORWARD_TRANSITIVE.FULL,FULL_TRANSITIVE.NONE— без проверки.
Iceberg / Delta schema evolution
Современные lakehouse-форматы — first-class schema evolution.
Iceberg supports:
- Add column.
- Rename column (без перезаписи данных — через column ID, не name).
- Drop column.
- Reorder.
- Type widening (int → long, float → double).
- Make optional (nullable).
ALTER TABLE events ADD COLUMN device_type STRING;
ALTER TABLE events RENAME COLUMN ts TO event_ts;
ALTER TABLE events ALTER COLUMN id TYPE BIGINT;Delta аналогично, но менее богато.
Это огромное преимущество над plain Parquet — можно эволюционировать без перезаписи petabytes.
Частые ошибки
Ломать compatibility без version bump. Producer закатил breaking change → consumer падает.
Schema registry без monitoring. Compatibility violations нужно ловить до prod.
Rename column в Parquet. Spark / Athena начнёт читать NULL вместо старого field. Используй Iceberg.
Type change без widening. int → string — данные не decoded.
Не использовать default для new fields. Старые консьюмеры падают на отсутствующем поле.
Tag поля required в новой версии. Старые сообщения без него — fail.
Связанные темы
- Parquet ORC Avro для DE
- Lakehouse Iceberg Delta для DE
- Kafka на собесе DE
- CDC и Debezium на собесе DE
- Подготовка к собесу Data Engineer
FAQ
Protobuf vs Avro для evolution?
Оба поддерживают. Protobuf — proto3 — все поля optional, легче. Avro требует defaults для evolution.
Можно ли откатить schema?
Через регистрацию старой версии как новой (если compatible). Иногда проще создать новый topic.
Это официальная информация?
Нет. Статья основана на Confluent docs, Apache Iceberg / Delta documentation.
Тренируйте Data Engineering — откройте тренажёр с 1500+ вопросами для собесов.