Learning Platform
Глоссарий Troubleshooting
Урок 08.05 · 14 мин
Продвинутый
GlutenVeloxPhotoncomparisoncontributingfuture directions

Comet vs альтернативы

Comet — не единственный проект, ускоряющий Spark через нативное исполнение. Gluten (на базе Meta Velox) и Databricks Photon решают ту же задачу, но с другой архитектурой. Разберём различия, критерии выбора и будущие направления.

Ландшафт Spark-ускорителей

Три проекта заменяют JVM execution engine Spark на нативный код:

Сравнение Spark-ускорителей
Apache CometRust/DataFusion-based ускоритель: SparkPlugin API, protobuf+JNI, Apache 2.0, Arrow columnar
Gluten + VeloxC++/Velox-based ускоритель от Meta: Substrait сериализация, Velox vectors, требует сборку C++
Databricks PhotonПроприетарный C++ engine Databricks — максимальная интеграция, доступен только в Databricks Runtime

Gluten + Velox

Gluten (Apache Incubator) — фреймворк для подключения нативных execution engine к Spark. По умолчанию использует Velox — С++ vectorized engine от Meta.

Архитектурные отличия от Comet

АспектCometGluten + Velox
Формат планаProtobuf (собственный expr.proto)Substrait (стандарт)
JVM-Native мостJNI напрямуюJNI через Gluten shim layer
FallbackAll-or-nothing per stageПотенциально per-operator (через Gluten)
Формат данныхArrow RecordBatchVelox RowVector (не Arrow)
ShuffleArrow IPC columnarVelox serialization
Memory managementDataFusion MemoryPool + DiskManagerVelox 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
NOTE

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ОбязателенНе нужен совсем
Протокол клиентаСтандартный SparkSpark Connect (gRPC)
PySpark APIЧерез JVM SparkНативно (UDF/UDAF/UDWF/UDTF в Rust/Python)
DataFusion интеграцияЧерез JNI + protobufПрямые logical/physical planning APIs
Распределённое выполнениеЧерез Spark schedulerСобственный Rust-кластер worker-ов
Migration pathDrop-in plugin (1 час)Drop-in replacement (Spark Connect клиенты)
JVM dependencyDa, нужен 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-инфраструктура — нет
NOTE

Comet не конкурирует с Sail напрямую: Comet ускоряет существующий Spark, Sail заменяет его. В долгосрочной перспективе Sail ставит сложный вопрос будущему Ballista/Spark-acceleration в DataFusion-экосистеме — об этом подробнее в модуле 8 (выбор стратегии).

Полное side-by-side сравнение Comet vs Sail

КритерийCometSail
АрхитектураJNI bridge внутри Spark JVM (plugin)Independent Rust сервис (no JVM)
Spark JVMТребуетсяНе нужен
УстановкаDrop-in JAR + 3 параметра в spark-defaults.confReplace Spark cluster полностью; deploy Sail binary
Migration effortМинимальный (1 час)Средний (Spark Connect клиенты обязательны)
API parity97% Spark SQL coverage (через JVM Spark)Спарк Connect API (DataFrame/SQL) — растущее покрытие
PySpark UDFЧерез JVM (Python ↔ JVM ↔ Rust)Native Rust integration (без JVM hop)
Plan formatProtobuf (Comet expr.proto)Прямой DataFusion logical plan
Data formatArrow RecordBatch (через JNI)Arrow native end-to-end
ShuffleColumnar Arrow IPCNative Rust shuffle
Distributed schedulingSpark scheduler (DAGScheduler/TaskScheduler)Собственный Rust scheduler
Cluster managerYARN/K8s/Standalone (Spark)K8s (Sail-native) или standalone Rust workers
Memory modelJVM heap + native off-heap (Comet pool)Pure Rust (DataFusion MemoryPool) — нет GC pauses
IcebergNative scan через native_iceberg_compat (0.12+)Через DataFusion ObjectStore + Iceberg crate
Delta LakeЧерез JVM Spark + delta-rsNative Rust delta-rs
Hive MetastoreПолная JVM-side интеграцияЧерез Rust metastore client (растущая)
Performance benchmark2–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.0Apache 2.0 (open core)
ЗрелостьApache project, 0.14+ (2025-2026)Production deployments LakeSail clients
Когда выбратьСуществующий Spark, минимум миграцииGreenfield или готовность к Spark Connect миграции
TIP

Decision rule: Если можете перевести клиентов на Spark Connect — Sail даёт более радикальный выигрыш (no JVM, end-to-end Rust, faster). Если миграция на Connect неприемлема — Comet даёт ускорение без архитектурных изменений. Для команд, инвестирующих в DataFusion ecosystem долгосрочно, Sail — более интересный путь, но операционно зрелее Comet.

Критерии выбора

КритерийCometGluten + VeloxPhoton
Open sourceApache 2.0Apache 2.0Нет
ДеплойЕдиный JARC++ зависимости, сложнее собратьВстроен в Databricks
DataFusion экосистемаНативная интеграцияНет связиНет связи
ЗрелостьРастущая (0.14.0, 8+ релизов/год)Более зрелая (Meta production)Production с 2021
Spark совместимость97% тестов~95% тестов~99% (с Delta)
IcebergНативный scan (0.12.0+)Через SubstraitЧерез Unity Catalog
CommunityApache DataFusion communityApache Incubator + MetaDatabricks

Когда выбрать Comet

  • Вы используете open-source Spark (не Databricks)
  • Вы уже инвестировали в DataFusion экосистему
  • Вам нужен простой деплой без C++ зависимостей
  • Parquet — основной формат хранения
  • Вы хотите контролировать execution engine и контрибьютить upstream

Когда выбрать Gluten + Velox

  • Вам нужна максимальная поддержка сложных выражений (Velox покрывает больше SQL)
  • Вы работаете с нестандартными форматами (ORC через Velox)
  • Команда готова к более сложной сборке и деплою

Когда выбрать Photon

  • Инфраструктура на Databricks
  • Нужна максимальная совместимость и стабильность
  • Budget позволяет проприетарное решение

Вклад в Comet

Comet — активно развивающийся проект Apache с хорошими точками входа для контрибьюторов:

Области для вклада

  1. Добавление поддержки выражений — самый частый тип контрибьюции:

    • Реализовать CometExpressionSerde для неподдерживаемого Spark-выражения
    • Добавить protobuf-сообщение в expr.proto
    • Написать Rust-маппинг в PhysicalPlanner
  2. Расширение покрытия типов данных — добавить поддержку CalendarIntervalType, YearMonthIntervalType

  3. Улучшение Iceberg-интеграции — расширение native_iceberg_compat (time travel, partition transforms)

  4. Бенчмарки и документация — запуск 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)
TIP

Для первого 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)
TIP

С версии 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

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

Результат: 0 из 0
Аналитический
Вопрос 1 из 5. Comet использует собственный protobuf-формат (expr.proto), а Gluten — стандарт Substrait. В чём практическое различие?

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

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

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

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