Apache Hudi специально создан для эффективного выполнения инкрементальной обработки данных и апсертов (upsert = update + insert) в Data Lake. Рассмотрим подробно оба механизма.


📌 1. Инкрементальная обработка (Incremental Processing)

Инкрементальная обработка в Apache Hudi означает возможность быстро читать только те данные, которые были добавлены или изменены с последнего запроса, без необходимости перечитывать весь датасет целиком.

Как это реализовано в Hudi:

  • Каждый коммит (изменение данных) получает уникальный timestamp (commit time).
  • При записи данных Hudi создаёт метаданные (commit metadata) с информацией о новых или изменённых файлах.
  • Инкрементальные запросы используют эти метаданные, чтобы быстро определить и прочитать только новые или изменённые данные.

Пример инкрементального запроса в Spark:

val incrementalDF = spark.read.format("hudi")
  .option("hoodie.datasource.query.type", "incremental")
  .option("hoodie.datasource.read.begin.instanttime", "20240226120000") // начиная с этого времени
  .load("/data/hudi/table")
 
incrementalDF.show()
 

Результат:

  • Возвращаются только записи, добавленные или изменённые после указанного времени.

📌 2. Апсерты (Upserts)

Апсерты в Apache Hudi — это возможность одновременно вставлять (insert) новые записи и обновлять (update) существующие записи по уникальному ключу.

Как это работает:

  • У каждой записи есть уникальный ключ (record key).
  • Hudi использует индекс (например, Bloom filter), чтобы быстро находить существующие записи в Data Lake.
  • Если запись с таким ключом уже есть, она обновляется; если нет — создаётся новая.

Пример апсерта (Spark API):

inputDF.write.format("hudi")
  .option("hoodie.datasource.write.operation", "upsert")
  .option("hoodie.datasource.write.recordkey.field", "id") // уникальный ключ записи
  .option("hoodie.datasource.write.precombine.field", "timestamp") // поле для разрешения конфликтов
  .option("hoodie.table.name", "my_hudi_table")
  .mode("append")
  .save("/data/hudi/table")
 

Результат:

  • Новые записи добавляются.
  • Существующие записи (с таким же id) обновляются автоматически.

⚙️ Механизм работы апсертов (Upserts) в деталях

Apache Hudi поддерживает два способа работы с данными:

🟢 Copy-on-Write (CoW)

  • При каждом изменении (апсерте) Hudi перезаписывает целиком изменённые файлы.
  • Идеален для сценариев, где важна максимальная скорость чтения данных (например, аналитика).

Когда использовать CoW:

  • Аналитика, batch-запросы, быстрая агрегация данных.

🟢 Merge-on-Read (MoR)

  • Hudi отдельно хранит базовые данные (Parquet-файлы) и отдельные файлы изменений (delta-файлы, обычно Avro).
  • При чтении данные объединяются на лету.
  • Идеален для сценариев с частыми обновлениями и потоковой аналитикой.

Когда использовать MoR:

  • Real-time аналитика, CDC, потоковые сценарии с частыми изменениями данных.

📊 Сравнение Copy-on-Write vs Merge-on-Read

Характеристика🟢 Copy-on-Write (CoW)🔸 Merge-on-Read (MoR)
Скорость чтения✅ Очень высокая🔸 Средняя
Скорость записи (upsert/update)🔸 Средняя (перезапись)✅ Очень высокая
Задержка данных🔸 Средняя✅ Низкая
Поддержка Streaming🔸 Средняя✅ Отличная
Оптимально дляBatch-аналитикаReal-time, CDC

🎯 Типичные сценарии использования Hudi

  • CDC (Change Data Capture):
    • Быстрое применение инкрементальных изменений из внешних источников (Kafka, Debezium).
  • Потоковая аналитика (Streaming Analytics):
    • Эффективное чтение только новых данных, минимальная задержка.
  • Real-time Dashboards:
    • Высокая скорость записи изменений, быстрая реакция на новые данные.
  • Compliance:
    • Лёгкое удаление и обновление персональных данных (upsert/delete).

📌 Преимущества инкрементальной обработки и апсертов в Apache Hudi:

  • 🔥 Сокращение времени и нагрузки на обработку данных:
    • Нет необходимости каждый раз обрабатывать весь датасет.
  • Поддержка изменений данных (CDC):
    • Эффективные и быстрые обновления данных на основе внешних событий.
  • 📅 Быстрая аналитика и real-time обновления:
    • Идеально для интерактивной и потоковой аналитики.
  • Эффективное использование ресурсов:
    • Снижает затраты на вычисления и хранение данных.

🚀 Краткий итог

ВозможностьКак это реализовано в Apache Hudi
Инкрементальные запросыHudi использует commit-маркеры и метаданные, чтобы быстро находить только новые/изменённые данные.
Апсерты (Upserts)Hudi индексирует записи по ключу и обновляет существующие или вставляет новые записи, используя CoW или MoR.

Apache Hudi эффективно решает задачи инкрементальной обработки данных и апсертов в Data Lake, обеспечивая поддержку real-time аналитики, CDC и других современных сценариев.