Vortex Compressed Compute
В предыдущем уроке мы разобрали архитектуру Vortex: extensible encodings, layout tree, cascading compression. Теперь — главное преимущество: compressed compute — выполнение запросов без полной декомпрессии данных.
Традиционный pipeline: read → decompress → decode → compute. Vortex pipeline: read → compute on encoded. Разница — 5-20x по скорости и значительно меньший memory footprint.
White-Box Encodings
“White-box” — ключевой термин в архитектуре Vortex. В отличие от “black-box” компрессии (ZSTD, LZ4), где engine видит только compressed blob, Vortex encodings прозрачны для query engine:
Black-Box (Parquet + ZSTD)
Black-box compression (Parquet + ZSTD/LZ4): engine видит compressed blob. Для любой операции (filter, aggregate, projection) — сначала decompress. Engine не знает структуру сжатых данных. Compression algorithm = непрозрачная функция.White-Box (Vortex)
White-box encodings (Vortex): engine знает тип encoding'а и его параметры. Dictionary: engine знает словарь и может фильтровать по index. RLE: engine знает (value, count) pairs и может агрегировать без развёртывания. Delta: engine может compute на дельтах.Compressed Compute Operations
Каждый encoding в Vortex предоставляет compute traits — набор операций, выполнимых без декомпрессии:
Filter Pushdown в Storage
Vortex pushdown’ит фильтры внутрь encoding’а, не просто на уровень chunk statistics:
Late Materialization
Vortex использует late materialization — откладывает декодирование до последнего момента:
Eager (Parquet)
Eager materialization (Parquet): декодировать все 4 колонки сразу, применить filter, отбросить нерелевантные строки. Если filter отсекает 99% — 99% decode work потрачено впустую.Late (Vortex)
Late materialization (Vortex): сначала filter на encoded country и age → bitmap matching строк → decode name и email ТОЛЬКО для matching строк. Decode work пропорционален result size, не input size.Late materialization особенно эффективна для wide tables (50-100+ колонок) с selective predicates (filter отсекает >90%). Типичный OLAP сценарий: SELECT 3 колонки из 100 WHERE filter оставляет 1% строк. Eager: decode 100 × 1M. Late: filter на 2-3 encoded колонках → decode 3 × 10K. 1000x разница в decode work.
SIMD-Friendly Decode: FastLanes
Когда декомпрессия всё-таки нужна, Vortex использует FastLanes для максимальной скорости:
BitPacked: 1M × 3 bits = 375KB
BitPacked данные: 1M значений × 3 bits = 375KB. Нужно распаковать в int32[]. Традиционный bitunpack: 1 значение за такт (scalar loop). FastLanes: 16 значений за такт (AVX-512).ARM NEON Support
FastLanes не привязан к x86. Поддержка ARM NEON для Apple Silicon и ARM серверов:
GPU Direct Decode
Vortex спроектирован для GPU-прямого декодирования — данные передаются с storage на GPU минуя CPU:
Traditional: CPU decode
Традиционный GPU pipeline: S3 → CPU memory → CPU decode → CPU → GPU copy → GPU compute. Три copy: S3→CPU, CPU decode (in-place), CPU→GPU. CPU decode — bottleneck для columnar данных.Vortex: GPU direct decode
Vortex GPU path: S3 → GPU memory (GPUDirect Storage / GDS). GPU decodes Vortex encodings (FastLanes → CUDA kernels). Нет CPU decode, нет CPU→GPU copy. GPU-resident pipeline.GPU direct decode — перспективная архитектура, не production feature текущей версии. NVIDIA GDS (GPUDirect Storage) доступен в CUDA 12+, но Vortex CUDA kernels — в разработке. Ценность: Vortex encodings (FastLanes bit operations) идеально маппятся на GPU SIMT architecture. Parquet encodings (dictionary lookup, RLE state machine) — плохо маппятся на GPU.
TPC-H Benchmarks
Результаты TPC-H SF100 (100GB), сравнение Parquet vs Vortex в DuckDB:
Ключевые TPC-H queries:
Parquet Compatibility Layer
Vortex обеспечивает обратную совместимость с Parquet через compatibility layer:
Read Parquet
Parquet → Vortex: чтение Parquet файлов через Vortex reader. Parquet encodings маппятся на Vortex encodings: DICTIONARY → Dictionary, RLE → RLE, PLAIN → Flat. Можно запустить compressed compute на 'imported' Parquet данных.Write Parquet
Vortex → Parquet: конвертация Vortex файлов в Parquet для совместимости с экосистемой (Spark, Presto, Athena). Vortex encodings транслируются в ближайшие Parquet encodings. Потеря: FastLanes, ALP, FSST недоступны в Parquet.Vortex + Iceberg Integration
Ключевая интеграция: Vortex как data file format в Apache Iceberg tables:
Iceberg Table (metadata layer)
Apache Iceberg — table format (metadata layer). Data files — pluggable: Parquet, ORC, или... Vortex. Iceberg manifest ссылается на .vortex файлы вместо .parquet. Metadata (snapshots, manifests) — без изменений.Vortex + Iceberg — самый практичный путь adoption. Команды не обязаны мигрировать весь data lake: новые партиции пишутся в Vortex, старые остаются в Parquet. Iceberg metadata управляет обоими форматами прозрачно. Это тот же паттерн, который использовал Parquet при вытеснении CSV — постепенная замена, не big-bang миграция.
Lance vs Vortex: позиционирование
Два формата атакуют Parquet с разных сторон:
Итоги
Compressed compute — это не оптимизация, а архитектурный сдвиг:
В следующих уроках (Модуль 16) мы продолжим исследование next-gen форматов: Nimble (Meta, “library-as-spec” для Velox) и F3 (CMU, WASM-embedded decoders как SIGMOD 2025 research).