Comet vs альтернативы
Comet — не единственный проект, ускоряющий Spark через нативное исполнение. Gluten (на базе Meta Velox) и Databricks Photon решают ту же задачу, но с другой архитектурой. Разберём различия, критерии выбора и будущие направления.
Ландшафт Spark-ускорителей
Три проекта заменяют JVM execution engine Spark на нативный код:
Gluten + Velox
Gluten (Apache Incubator) — фреймворк для подключения нативных execution engine к Spark. По умолчанию использует Velox — С++ vectorized engine от Meta.
Архитектурные отличия от Comet
| Аспект | Comet | Gluten + Velox |
|---|---|---|
| Формат плана | Protobuf (собственный expr.proto) | Substrait (стандарт) |
| JVM-Native мост | JNI напрямую | JNI через Gluten shim layer |
| Fallback | All-or-nothing per stage | Потенциально per-operator (через Gluten) |
| Формат данных | Arrow RecordBatch | Velox RowVector (не Arrow) |
| Shuffle | Arrow IPC columnar | Velox serialization |
| Memory management | DataFusion MemoryPool + DiskManager | Velox MemoryManager + spill |
Substrait vs Protobuf
Gluten использует Substrait — межпроектный стандарт для описания вычислительных планов. Comet использует собственный protobuf-формат (expr.proto):
- Substrait — стандартизован, теоретически позволяет подключать разные backend-ы (Velox, DuckDB, DataFusion). На практике Gluten тесно связан с Velox
- Comet Protobuf — специализирован под DataFusion, меньше abstraction overhead, но не переносим на другие engine
Производительность
Прямые бенчмарки между Comet и Gluten зависят от запроса:
- Scan/Filter/Project: сопоставимы — оба используют нативное чтение Parquet и векторизированную фильтрацию
- Complex aggregation/join: Velox имеет более зрелую adaptive execution; Comet использует стандартные DataFusion join-алгоритмы
- Shuffle: Comet columnar shuffle (Arrow IPC) vs Velox serialization — зависит от payload
Comet опубликовал сравнительный guide с Gluten/Velox начиная с версии 0.10.0. Основной аргумент: Comet проще в деплое (единый JAR, нет C++ зависимостей) и теснее интегрирован с Apache DataFusion экосистемой.
Databricks Photon
Photon — проприетарный нативный execution engine, встроенный в Databricks Runtime:
- Не доступен вне Databricks — нельзя использовать с open-source Spark
- Глубокая интеграция — Photon знает о Delta Lake internals, Databricks caching, adaptive query execution
- Automatic fallback — бесшовный fallback на JVM для неподдерживаемых операций
- Production-ready — используется в Databricks с 2021 года
Когда выбрать Photon
Если ваша инфраструктура уже на Databricks — Photon включается одним параметром (spark.databricks.photon.enabled=true). Нет причин использовать Comet или Gluten в Databricks-окружении.
LakeSail Sail: drop-in Spark replacement
Sail (LakeSail) — главный 2026 drop-in Spark replacement, написанный на Rust и построенный поверх DataFusion. В отличие от Comet, который встраивается в JVM-процесс Spark как plugin, Sail — самостоятельная распределённая система, реализующая Spark Connect-протокол и PySpark API целиком на Rust. По публичным замерам LakeSail заявляет 4–8x throughput vs Spark и сокращение инфраструктурных затрат до 94%.
Архитектурное различие: Comet vs Sail
| Аспект | Comet (Spark JNI bridge) | Sail (independent Spark API rewrite) |
|---|---|---|
| Подход | Plugin внутри Spark JVM | Самостоятельный Rust-сервис |
| Spark JVM | Обязателен | Не нужен совсем |
| Протокол клиента | Стандартный Spark | Spark Connect (gRPC) |
| PySpark API | Через JVM Spark | Нативно (UDF/UDAF/UDWF/UDTF в Rust/Python) |
| DataFusion интеграция | Через JNI + protobuf | Прямые logical/physical planning APIs |
| Распределённое выполнение | Через Spark scheduler | Собственный Rust-кластер worker-ов |
| Migration path | Drop-in plugin (1 час) | Drop-in replacement (Spark Connect клиенты) |
| JVM dependency | Da, нужен Spark runtime | Нет, только Rust binary |
Когда выбрать Comet
- Уже есть production Spark cluster, миграция на новый runtime неприемлема
- Нужна полная совместимость с существующим Spark-стеком (UDF на Scala/Java, custom Spark plugins)
- Команда готова поддерживать JVM и Rust одновременно
- Acceleration важнее, чем избавление от JVM
Когда выбрать Sail
- Можно перейти на Spark Connect-клиенты (PySpark, Spark SQL через gRPC)
- Цель — полный отказ от JVM (operational simplicity, memory safety, нет GC pauses)
- Греинфилд-проект или готовность к серьёзной миграции
- Spark API нужен, но Spark JVM-инфраструктура — нет
Comet не конкурирует с Sail напрямую: Comet ускоряет существующий Spark, Sail заменяет его. В долгосрочной перспективе Sail ставит сложный вопрос будущему Ballista/Spark-acceleration в DataFusion-экосистеме — об этом подробнее в модуле 8 (выбор стратегии).
Полное side-by-side сравнение Comet vs Sail
| Критерий | Comet | Sail |
|---|---|---|
| Архитектура | JNI bridge внутри Spark JVM (plugin) | Independent Rust сервис (no JVM) |
| Spark JVM | Требуется | Не нужен |
| Установка | Drop-in JAR + 3 параметра в spark-defaults.conf | Replace Spark cluster полностью; deploy Sail binary |
| Migration effort | Минимальный (1 час) | Средний (Spark Connect клиенты обязательны) |
| API parity | 97% Spark SQL coverage (через JVM Spark) | Спарк Connect API (DataFrame/SQL) — растущее покрытие |
| PySpark UDF | Через JVM (Python ↔ JVM ↔ Rust) | Native Rust integration (без JVM hop) |
| Plan format | Protobuf (Comet expr.proto) | Прямой DataFusion logical plan |
| Data format | Arrow RecordBatch (через JNI) | Arrow native end-to-end |
| Shuffle | Columnar Arrow IPC | Native Rust shuffle |
| Distributed scheduling | Spark scheduler (DAGScheduler/TaskScheduler) | Собственный Rust scheduler |
| Cluster manager | YARN/K8s/Standalone (Spark) | K8s (Sail-native) или standalone Rust workers |
| Memory model | JVM heap + native off-heap (Comet pool) | Pure Rust (DataFusion MemoryPool) — нет GC pauses |
| Iceberg | Native scan через native_iceberg_compat (0.12+) | Через DataFusion ObjectStore + Iceberg crate |
| Delta Lake | Через JVM Spark + delta-rs | Native Rust delta-rs |
| Hive Metastore | Полная JVM-side интеграция | Через Rust metastore client (растущая) |
| Performance benchmark | 2–3× vs vanilla Spark (TPC-H) | LakeSail заявляет 4–8× vs vanilla Spark |
| Operational simplicity | Нужен JVM tuning + Comet tuning | Только Rust binary (один процесс типа) |
| Memory safety | Безопасность Rust только в native слое | End-to-end Rust memory safety |
| GC pauses | Да (JVM heap) | Нет (no GC) |
| Лицензия | Apache 2.0 | Apache 2.0 (open core) |
| Зрелость | Apache project, 0.14+ (2025-2026) | Production deployments LakeSail clients |
| Когда выбрать | Существующий Spark, минимум миграции | Greenfield или готовность к Spark Connect миграции |
Decision rule: Если можете перевести клиентов на Spark Connect — Sail даёт более радикальный выигрыш (no JVM, end-to-end Rust, faster). Если миграция на Connect неприемлема — Comet даёт ускорение без архитектурных изменений. Для команд, инвестирующих в DataFusion ecosystem долгосрочно, Sail — более интересный путь, но операционно зрелее Comet.
Критерии выбора
| Критерий | Comet | Gluten + Velox | Photon |
|---|---|---|---|
| Open source | Apache 2.0 | Apache 2.0 | Нет |
| Деплой | Единый JAR | C++ зависимости, сложнее собрать | Встроен в Databricks |
| DataFusion экосистема | Нативная интеграция | Нет связи | Нет связи |
| Зрелость | Растущая (0.14.0, 8+ релизов/год) | Более зрелая (Meta production) | Production с 2021 |
| Spark совместимость | 97% тестов | ~95% тестов | ~99% (с Delta) |
| Iceberg | Нативный scan (0.12.0+) | Через Substrait | Через Unity Catalog |
| Community | Apache DataFusion community | Apache Incubator + Meta | Databricks |
Когда выбрать Comet
- Вы используете open-source Spark (не Databricks)
- Вы уже инвестировали в DataFusion экосистему
- Вам нужен простой деплой без C++ зависимостей
- Parquet — основной формат хранения
- Вы хотите контролировать execution engine и контрибьютить upstream
Когда выбрать Gluten + Velox
- Вам нужна максимальная поддержка сложных выражений (Velox покрывает больше SQL)
- Вы работаете с нестандартными форматами (ORC через Velox)
- Команда готова к более сложной сборке и деплою
Когда выбрать Photon
- Инфраструктура на Databricks
- Нужна максимальная совместимость и стабильность
- Budget позволяет проприетарное решение
Вклад в Comet
Comet — активно развивающийся проект Apache с хорошими точками входа для контрибьюторов:
Области для вклада
-
Добавление поддержки выражений — самый частый тип контрибьюции:
- Реализовать
CometExpressionSerdeдля неподдерживаемого Spark-выражения - Добавить protobuf-сообщение в
expr.proto - Написать Rust-маппинг в
PhysicalPlanner
- Реализовать
-
Расширение покрытия типов данных — добавить поддержку
CalendarIntervalType,YearMonthIntervalType -
Улучшение Iceberg-интеграции — расширение
native_iceberg_compat(time travel, partition transforms) -
Бенчмарки и документация — запуск TPC-DS, сравнительные отчёты
Архитектура для контрибьюции
apache/datafusion-comet/
├── common/ # Общие утилиты
├── spark/ # Scala-код: CometPlugin, CometExecRule, CometScanRule
├── native/ # Rust-код: PhysicalPlanner, serde, execution
│ └── core/
│ ├── src/
│ │ ├── execution/ # Нативные execution nodes
│ │ ├── parquet/ # Parquet reader
│ │ └── planner.rs # PhysicalPlanner
│ └── Cargo.toml
└── proto/ # Protobuf definitions (expr.proto)
Для первого PR рекомендуется взять issue с меткой «good first issue» — обычно это добавление поддержки одного Spark-выражения. Процесс: добавить protobuf-сообщение → реализовать Scala-сериализацию → реализовать Rust-десериализацию и маппинг → написать тест.
Пример: принятие решения
Допустим, ваша компания использует open-source Spark 3.5 на EMR / Dataproc / on-premise. Аналитические запросы по TPC-H-подобным нагрузкам занимают 40% бюджета вычислений. Варианты:
| Действие | Усилие | Ожидаемый результат |
|---|---|---|
| Добавить Comet JAR + 3 параметра | Минимальное (1 час) | 2x ускорение → ~20% экономия compute |
| Собрать и задеплоить Gluten+Velox | Среднее (1-2 дня, C++ зависимости) | 2-2.5x ускорение, больше покрытие SQL |
| Мигрировать на Databricks + Photon | Высокое (недели, vendor lock-in) | 2-3x ускорение + экосистема Databricks |
Comet даёт лучшее соотношение «усилие → результат» для начала. Если покрытие выражений недостаточно — можно контрибьютить или перейти на Gluten.
Будущие направления
Comet roadmap
- Spark 4.0 полная поддержка — адаптация к ANSI mode по умолчанию, новые типы данных
- Расширение покрытия выражений — каждый релиз добавляет 10-20 выражений
- Нативный Iceberg scan — расширение
native_iceberg_compatдо production-ready - Улучшение shuffle — адаптивное переключение между columnar и row-based shuffle в зависимости от payload
- Partial replacement — экспериментальная работа над per-operator fallback вместо all-or-nothing (пока не реализовано)
Comet в контексте DataFusion
Comet демонстрирует паттерн использования DataFusion как embedded library (разобранный в модуле 05 — Паттерны расширяемости):
- DataFusion предоставляет execution primitives (
FilterExec,ProjectionExec,HashJoinExec) - Comet транслирует внешние планы (Spark) в эти примитивы
- Аналогичный паттерн используют InfluxDB IOx (InfluxQL → DataFusion) и GreptimeDB (PromQL → DataFusion)
С версии DataFusion 48 появился крейт datafusion-spark — набор Spark-совместимых скалярных функций для DataFusion. Это позволяет использовать Spark-специфичные функции (например, conv, hex, unhex) напрямую в DataFusion без Comet. Крейт полезен при миграции Spark SQL-запросов на «чистый» DataFusion.
В следующем модуле мы рассмотрим альтернативный подход — распределённое исполнение через Ballista и DataFusion Ray, где DataFusion работает не как embedded engine, а как ядро распределённой системы.
Итоги
- Три Spark-ускорителя: Comet (DataFusion, Rust), Gluten+Velox (C++), Photon (проприетарный, Databricks)
- Comet vs Gluten: Protobuf vs Substrait, Arrow vs Velox vectors, один JAR vs C++ зависимости
- Photon — только в Databricks, максимальная совместимость и стабильность
- Comet выбирают для: open-source Spark + DataFusion экосистема + простой деплой
- Контрибьюция: добавление выражений (CometExpressionSerde + protobuf + PhysicalPlanner)
- Roadmap: расширение покрытия выражений, Spark 4.0, нативный Iceberg, улучшение shuffle