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 и других современных сценариев.