Learning Platform
Глоссарий Troubleshooting
Урок 12.06 · 30 мин
Продвинутый
Delta LakeDelta KernelUniFormDelta SharingEngine Compatibilitydelta-rsdelta-kernel-rsIcebergHudiCatalog

Delta Kernel, UniForm и экосистема

Delta Lake — это протокол, а не движок. Но протокол полезен только если его поддерживают множество движков. В первые годы жизни Delta Lake каждый коннектор (delta-rs, Trino delta connector, Flink connector) реализовывал protocol spec самостоятельно. С ростом сложности протокола (Deletion Vectors, V2 Checkpoints, Type Widening) это стало неустойчивым.

Этот урок — о том, как Delta Lake решает проблему экосистемной фрагментации: Delta Kernel, UniForm, Delta Sharing, и матрица совместимости движков.

Delta Kernel

Delta Kernel — набор библиотек, которые абстрагируют детали протокола от connector-разработчиков. Вместо реализации spec побайтово, разработчик реализует Engine trait (набор интерфейсов для чтения JSON/Parquet и работы с файловой системой), а Kernel берёт на себя log replay, conflict resolution, data skipping и protocol features.

Delta Kernel: архитектура (Engine / Scan / Protocol)

Движок (DuckDB, DataFusion, ClickHouse, Trino, …)

Движок (DuckDB, DataFusion, Polars, ClickHouse, Trino и др.) хочет читать/писать Delta-таблицу. Вместо реализации протокола самостоятельно, он использует Delta Kernel.
Реализует Engine trait
Engine traitНабор интерфейсов, которые движок должен реализовать: JsonHandler (чтение JSON), ParquetHandler (чтение Parquet), StorageHandler (листинг и чтение файлов), ExpressionHandler (вычисление выражений). Kernel предоставляет DefaultEngine (на Arrow + Tokio) — можно использовать как есть.
Kernel CoreЯдро Kernel: log replay (чтение checkpoint + JSON-коммитов), protocol parsing, data skipping (stats-based filtering), conflict resolution, checkpoint creation. Движок НЕ реализует это — Kernel делает всё сам.
ScanТочка входа для чтения. Scan строит список файлов для чтения, применяет predicate pushdown (data skipping), и возвращает итератор ScanResult с данными и selection vectors.
TransactionТочка входа для записи. Transaction принимает новые данные, создаёт add/remove action, проверяет конфликты (OCC), и коммитит в _delta_log/. Экспериментальный — пока поддерживает только blind append.

Delta Table (S3 / ADLS / GCS / Local FS)

Delta-таблица на storage (S3, ADLS, GCS, локальная FS). Kernel абстрагирует детали протокола — движок работает через высокоуровневый API (Scan/Transaction), не зная о protocol versions, deletion vectors, или checkpoint formats.

Два Kernel — Rust и Java

Delta Kernel существует в двух реализациях:

delta-kernel-rs (Rust)Delta Kernel Java
ЯзыкRust + C FFIJava
Целевые движкиDuckDB, DataFusion, Polars, ClickHouse, C/C++Spark, Trino, Flink, JVM-based
In-memory форматArrowHeap-based vectors
СтатусExperimental (v0.20.0) — reads + writes (blind append)Experimental — reads + writes
DefaultEngineArrow + Tokio (async)Встроенный
Репозиторийdelta-io/delta-kernel-rsdelta-io/delta-kernel
// Пример: чтение Delta-таблицы через delta-kernel-rs (Rust)
use delta_kernel::engine::default::DefaultEngine;
use delta_kernel::Table;

let engine = DefaultEngine::try_new(
 &url::Url::parse("file:///path/to/table").unwrap(),
 std::collections::HashMap::new(),
)?;
let table = Table::try_from_uri("file:///path/to/table")?;
let snapshot = table.snapshot(&engine, None)?;
let scan = snapshot.into_scan_builder().build()?;

// Scan возвращает ScanResult — итератор файлов с данными
for result in scan.execute(&engine)? {
 let scan_result = result?;
 // scan_result.raw_data — данные в Arrow формате
 // scan_result.mask — selection vector (deletion vectors)
}
NOTE

Delta Kernel не заменяет delta-rs (Python deltalake library). delta-rs — полноценная реализация Delta Lake на Rust с высокоуровневым API. Delta Kernel — низкоуровневый фундамент, на котором строятся коннекторы. delta-rs уже начал интеграцию с delta-kernel-rs для protocol handling.

Зачем Kernel?

Проблема без Kernel: каждый коннектор реализует protocol spec самостоятельно. При добавлении новой protocol feature (например, Deletion Vectors) все коннекторы должны обновиться. На практике коннекторы отстают на месяцы-годы, что фрагментирует экосистему.

С Kernel: новая protocol feature реализуется один раз в Kernel. Все коннекторы, использующие Kernel, получают поддержку автоматически при обновлении зависимости.

UniForm: Universal Format

UniForm — механизм автоматической генерации Iceberg-метаданных (и опционально Hudi) при каждой записи в Delta-таблицу. Одна копия Parquet-файлов — несколько форматов метаданных:

UniForm: одна копия данных, несколько форматов метаданных

Запись в Delta-таблицу (Spark, delta-rs, Flink)

Запись в Delta-таблицу через любой Delta-writer (Spark, delta-rs, Flink). UniForm включён как table property.
Delta commit
Parquet Data FilesЕдинственная копия данных. Parquet-файлы одинаковы для Delta, Iceberg и Hudi — все три формата используют Parquet для хранения данных. При UniForm кодек сжатия — Zstandard (вместо Snappy).
Асинхронная генерация метаданных
Delta MetadataСтандартные Delta-метаданные: _delta_log/ с JSON-коммитами и Parquet-чекпоинтами. Это основной формат — UniForm не изменяет его.
Iceberg MetadataАвтоматически сгенерированные Iceberg-метаданные: metadata JSON, manifest lists, manifest files в директории metadata/. Iceberg-клиенты (Snowflake, Trino, BigQuery, Athena) читают таблицу как Iceberg.
Hudi Metadata (опц.)Опциональная генерация Hudi-метаданных. Hudi-клиенты могут читать таблицу как Hudi-таблицу. Менее распространено, чем Iceberg-совместимость.

Delta readers + Iceberg readers + Hudi readers → одни данные

Один набор Parquet-файлов читается через Delta-клиенты (Spark, DataFusion, Polars), Iceberg-клиенты (Snowflake, Trino, BigQuery, Athena), и опционально Hudi-клиенты. Без дублирования данных.

Включение UniForm

-- При создании таблицы (Delta Lake 3.1+)
CREATE TABLE orders (
 order_id BIGINT,
 city STRING,
 amount DECIMAL(10, 2)
) TBLPROPERTIES (
 'delta.enableIcebergCompatV2' = 'true',
 'delta.universalFormat.enabledFormats' = 'iceberg'
);

-- Для существующей таблицы (Delta Lake 3.2+)
REORG TABLE orders APPLY (UPGRADE UNIFORM(ICEBERG_COMPAT_VERSION=2));

Ограничения UniForm

  • UniForm — read-only для Iceberg/Hudi клиентов. Запись через Iceberg-клиент может повредить Delta-таблицу
  • Требует column mapping (minReaderVersion ≥ 2, minWriterVersion ≥ 7)
  • Не совместим с Deletion Vectors
  • Iceberg-версии не совпадают с Delta-версиями (metadata generation — асинхронная)
  • Требует Hive Metastore (HMS) или Unity Catalog как Iceberg catalog
WARNING

UniForm — однонаправленный. Delta Lake пишет, Iceberg/Hudi клиенты только читают. Запись через Iceberg-клиент в UniForm-таблицу может выполнить garbage collection, о котором Delta не знает — и уничтожить данные.

Delta Sharing

Delta Sharing — открытый протокол для безопасного обмена данными без копирования:

Delta Sharing: безопасный обмен данными
Data ProviderВладелец данных. Запускает Delta Sharing Server, определяет shares (наборы таблиц), schemas, и таблицы. Управляет доступом через recipient tokens.
REST API + Pre-signed URLs
Data RecipientПотребитель данных. Использует Delta Sharing client (Python, Spark, pandas) для чтения. Получает pre-signed URLs для прямого доступа к Parquet-файлам. Данные не копируются — читаются на месте.

Ключевые принципы:

  • Данные не копируются — recipient получает pre-signed URLs для чтения Parquet-файлов напрямую из storage provider-а
  • REST API — стандартный HTTP протокол, клиент может быть на любом языке
  • Recipient tokens — авторизация через bearer tokens с expiration
  • Table versioning — recipient может указать version или timestamp для time travel
# Delta Sharing: чтение shared таблицы
import delta_sharing

# Profile файл содержит endpoint + bearer token
profile = delta_sharing.SharingProfile.read("./provider.share")

# Листинг доступных таблиц
client = delta_sharing.SharingClient(profile)
tables = client.list_all_tables()

# Чтение таблицы в pandas
table_url = f"{profile}#share_name.schema_name.table_name"
df = delta_sharing.load_as_pandas(table_url)

Catalog-Managed Tables

Delta Lake 4.1 вводит концепцию Catalog-Managed Tables — каталог (Unity Catalog, Hive Metastore) становится source of truth для состояния таблицы:

  • Каталог управляет storage location, metadata caching, и garbage collection
  • Автоматический VACUUM — каталог запускает cleanup без ручного вмешательства
  • Автоматический OPTIMIZE — clustering on write, adaptive file sizing
  • Credential vending — временные учётные данные для доступа к storage

Это отличается от традиционной модели, где таблица — самодостаточная (всё состояние в _delta_log/), а каталог — опциональный discovery layer.

Матрица совместимости движков

Экосистема Delta Lake: матрица совместимости
ДвижокДвижки, поддерживающие чтение/запись Delta Lake таблиц.
ЧтениеПоддержка чтения Delta-таблиц.
ЗаписьПоддержка записи в Delta-таблицы.
РеализацияКакая библиотека/коннектор используется для поддержки Delta Lake.
Apache Spark — нативная поддержка Delta Lake. Разрабатывается той же командой (Databricks).
Полная поддержка чтения: snapshot, time travel, CDF, streaming.
Полная поддержка записи: INSERT, UPDATE, DELETE, MERGE, OPTIMIZE, Z-ORDER, Liquid Clustering, VACUUM.
Нативная реализация — delta-spark (io.delta:delta-spark). Reference implementation.
Apache DataFusion — query engine на Rust. Использует delta-rs для Delta Lake поддержки.
Полная поддержка чтения через delta-rs: snapshot, time travel, predicate pushdown.
Поддержка записи через delta-rs: INSERT, MERGE, UPDATE, DELETE, OPTIMIZE.
delta-rs (Rust) — нативная Rust-реализация Delta Lake.
DuckDB — in-process analytical database. Delta extension использует delta-kernel-rs для чтения.
Поддержка чтения через delta extension: snapshot, predicate pushdown.
Запись через delta extension — поддержка появилась недавно.
delta extension (использует delta-kernel-rs внутри).
Polars — DataFrame library на Rust. Использует delta-rs для Delta Lake поддержки.
Полная поддержка чтения через delta-rs: scan, filtering, projection.
Поддержка записи через delta-rs: write, overwrite, merge.
delta-rs (через PyO3 Python bindings).
Trino — distributed SQL query engine. Delta Lake connector реализован как Trino plugin.
Полная поддержка чтения: snapshot, time travel, predicate pushdown.
Поддержка записи: INSERT, DELETE, UPDATE, MERGE.
Trino delta connector (Java, использует Delta Kernel Java).
Apache Flink — stream processing framework. Delta connector для Flink поддерживает streaming sink.
Поддержка чтения: batch и streaming source.
Поддержка записи: streaming sink с exactly-once semantics.
delta-flink connector (Java).
Python deltalake library — Python bindings для delta-rs. Самодостаточная библиотека без зависимости на Spark/JVM.
Полная поддержка чтения: snapshot, time travel, CDF, PyArrow integration.
Полная поддержка записи: write, overwrite, merge, update, delete, optimize, vacuum.
deltalake — Python bindings для delta-rs через PyO3. pip install deltalake.
TIP

Для Python-first стека без Spark рекомендуется библиотека deltalake (delta-rs) — нативная Rust-реализация с Python bindings через PyO3. Нет зависимости на JVM, нет Spark runtime, работает с PyArrow, pandas, Polars. pip install deltalake — и готово.

Когда использовать Delta Lake

Delta Lake — сильный выбор когда:

СценарийDelta LakeАльтернатива
Streaming + batch на одной таблице+ Streaming reads, CDF, exactly-onceIceberg (поддерживает, но менее зрелый streaming)
Databricks/Spark экосистема+ Нативная поддержка, все featuresIceberg (нативный в Snowflake)
Python-first стек без JVM+ delta-rs, deltalake libraryIceberg (PyIceberg)
Multi-engine reads (Snowflake + Spark)+ UniForm → Iceberg клиентыIceberg (нативно multi-engine)
Очень большие таблицы (PB scale)+ Liquid Clustering, OPTIMIZEIceberg (более зрелый metadata pruning)
Строгий multi-engine writeUniForm read-onlyIceberg (REST Catalog)

Детальное сравнение Delta Lake, Iceberg, Hudi и Paimon — в Модуле 17: Выбор формата на практике.

Итоги модуля

За 6 уроков мы разобрали Delta Lake побайтово — от JSON-коммитов в _delta_log/ до Liquid Clustering и UniForm:

  1. Transaction Log — JSON actions, protocol versions, checkpoints
  2. ACID-транзакции — OCC, conflict resolution, Coordinated Commits
  3. Time Travel + VACUUM — version/timestamp access, retention, log replay
  4. Оптимизация размещения — data skipping, OPTIMIZE, Z-ORDER, Liquid Clustering
  5. Change Data Feed — incremental ETL, streaming reads, medallion architecture
  6. Kernel + UniForm + экосистема — connector foundation, multi-format reads
NOTE

Продолжение — Модуль 12: Apache Iceberg Deep-Dive, где мы разберём альтернативный table format с другой архитектурой метаданных.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 4. Что такое Delta Kernel и какую проблему он решает?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 6