hudi iceberg - ghdrako/doc_snipets GitHub Wiki

Apache Hudi (Hadoop Upserts Deletes and Incrementals) is an open-source data lake framework that helps you manage large-scale data efficiently on top of distributed storage systems like HDFS, Amazon S3, Azure Blob Storage, or Google Cloud Storage.

It enables incremental data processing and provides features traditionally found in databases — such as upserts, deletes, and transactions — directly on your data lake.

Apache Hudi i Apache Iceberg mają ten sam cel:

  • Uczynić z data lake coś w rodzaju bazy danych — czyli dodać transakcyjność, wersjonowanie, upserty, time travel i spójność.
  • Bez nich, surowy S3/HDFS to tylko zbiór plików — a nie system danych.
Cecha Apache Hudi Apache Iceberg
🎯 Cel główny Streaming + Incremental ingestion (real-time pipelines) Batch analytics + dużej skali zapytania SQL
🧠 Architektura Zarządza zarówno danymi, jak i zmianami (log + parquet) Oddziela metadane od danych – czyste snapshoty
⚙️ Tryby przechowywania Copy-on-Write (COW) i Merge-on-Read (MOR) Snapshot-based (tylko „pełne wersje”)
🔁 Upserty / CDC ✅ Wbudowane wsparcie dla upsert/delete (idealne dla Kafki i CDC) ⚠️ Działa, ale nieco mniej wydajnie (trzeba przepisywać pliki)
⚡ Streaming (Flink/Spark) Bardzo mocna integracja z Flink, Spark Structured Streaming Wsparcie rośnie, ale dopiero się rozwija
🧾 Time travel / wersjonowanie ✅ Pełne ✅ Pełne
📊 Integracja z query engines Hive, Spark, Flink, Presto, Trino, Athena Spark, Flink, Trino, Snowflake, BigQuery, Athena, etc.
🧱 Metadane Trzymane częściowo w .hoodie/ i w logach Przechowywane w osobnym katalogu metadata/ z plikami manifestów
🔍 Performance przy czytaniu Czasem wolniejsze (bo musi łączyć log + base files w MOR) Bardzo szybkie – snapshot ma już gotową strukturę
🧰 Zastosowanie ETL, streaming, incremental pipelines, CDC Analytics, BI, data warehouse replacement
☁️ Adopcja Uber, Amazon, Tencent, Alibaba, Bytedance Netflix (twórca), Apple, Adobe, Airbnb, Snowflake

Apache Hudi:

👉 Myślisz w kategoriach ciągłego dopisywania i aktualizowania danych (np. dane z Kafki, upserty z bazy OLTP, eventy IoT)

Pipeline: Kafka → Spark/Flink → Hudi (S3) → Presto/Athena/Hive Kafka → Spark/Flink → Hudi (S3) → Presto/Athena/Hive

  • Piszesz często, czytasz często.
  • Chcesz aktualizować rekordy.
  • Hudi sam dba o to, które rekordy są aktualne.

Apache Iceberg:

👉 Myślisz w kategoriach czystych snapshotów tabel (np. duże wsady danych, raporty BI, batch analytics)

Pipeline:Spark/Flink → Iceberg (S3) → Trino/Snowflake/BigQuery

  • Rzadziej piszesz, ale za to chcesz szybkie zapytania analityczne.
  • Iceberg świetnie optymalizuje metadane i partycjonowanie.
  • Ma bardzo dobrą integrację z narzędziami BI (np. Snowflake, Dremio).
Jeśli chcesz... Wybierz
Budować real-time pipeline (Kafka → S3) 🟢 Hudi
Robić CDC i upserty z baz relacyjnych 🟢 Hudi
Budować data lakehouse z dużymi wsadami danych 🟣 Iceberg
Skupić się na BI i analizie (np. z Trino/Snowflake) 🟣 Iceberg
Mieć minimalny narzut i prostą integrację 🟣 Iceberg
Mieć maksymalną elastyczność i streaming + batch w jednym 🟢 Hudi

Apache Hudi to w dużym skrócie warstwa zarządzania nad plikami Parquet, która:

  • kontroluje jak dane są zapisywane, aktualizowane i usuwane,
  • udostępnia interfejsy do odczytu, zapisu i przeglądania metadanych,
  • a wszystko to w sposób zgodny z narzędziami typu Spark, Flink, Presto, Hive czy Athena.

Zarządzanie plikami Parquet

  • Fizycznie dane nadal leżą jako pliki Parquet w S3 / HDFS / GCS.
  • Hudi tylko „nakłada” na nie logikę transakcji i wersjonowania.
  • Pliki Parquet nie są już surowe — są powiązane z metadanymi Hudi.

📂 Przykładowa struktura:

s3://my-bucket/hudi/users/
 ├── .hoodie/                     ← katalog z metadanymi i commit logami
 │    ├── commit_20251029_123456.json
 │    ├── timeline
 │    ├── schema
 │    └── auxiliary files
 ├── partition_date=2025-10-29/
 │    ├── 12345_20251029_123456.parquet
 │    └── 12345_20251029_123456.log.avro   ← dla Merge-on-Read

Zapis danych (Write path)
  • Hudi kontroluje zapisy poprzez własne API lub integrację ze Spark/Flink:

Możesz wykonać:

  • insert
  • upsert (insert lub update)
  • delete
  • bulk_insert

Każda operacja tworzy nowy commit (.hoodie/commit_*.json),który zapisuje:

  • listę zmodyfikowanych plików,
  • wersję schematu,
  • timestamp,
  • status transakcji.

🧩 To sprawia, że masz pełną historię wersji tabeli i możesz robić time travel (czyli np. zapytanie „pokaż dane z wczoraj”).

Odczyt danych (Read path)
  • Hudi udostępnia dane przez standardowe silniki, ale sam decyduje które pliki Parquet i logi Avro należy scalić, by pokazać najnowszą wersję rekordów.

Tryby odczytu:

  • Snapshot Query → pokazuje najnowszy stan tabeli.
  • Incremental Query → zwraca tylko dane od danego commita (np. „co się zmieniło od wczoraj”).
  • Read Optimized Query → czyta tylko Parquet (bez logów, szybciej, ale bez najnowszych zmian).

📘 W Spark możesz to zrobić tak:

df = spark.read.format("hudi") \
    .option("hoodie.datasource.query.type", "snapshot") \
    .load("s3://my-bucket/hudi/users/")
Metadane (Metadata management)

8 Hudi utrzymuje timeline — sekwencję commitów z metainformacjami:

Każdy commit zawiera:

  • ID i timestamp (instantTime)
  • Typ operacji (insert, upsert, compaction, rollback)
  • Pliki, które się zmieniły
  • Schemat tabeli (jeśli się zmienił)
  • Statystyki zapisów

Dzięki temu:

  • można robić time travel (as.of.instant = ...)
  • można szybko pobrać listę zmian (dla incremental ETL)
  • można zbudować metadane w Hive lub Glue Catalog automatycznie

5️⃣ Integracja z katalogami metadanych (Hive / Glue / AWS Athena)

Hudi potrafi automatycznie rejestrować tabele i partycje w:

  • Hive Metastore
  • AWS Glue Catalog
  • Databricks Unity Catalog (częściowo)

Dzięki temu Athena czy Presto widzą tabelę Hudi tak samo, jak zwykłą tabelę Hive:

SELECT * FROM users_hudi WHERE partition_date='2025-10-29';

Architektura Apache Hudi w GCP

   Pub/Sub / Cloud SQL / BigQuery Export
                 ↓
       Dataflow (Flink) / Dataproc (Spark)
                 ↓
         Apache Hudi (na GCS)
                 ↓
     BigQuery / Dataplex / Looker / Spark SQL
Komponent Rola w GCP Kompatybilność
Hudi on GCS Warstwa danych (storage + metadane) ✅ Pełna
Dataproc (Spark) ETL / batch processing ✅ Pełna
Dataflow (Flink) Streaming / CDC ✅ Pełna
BigQuery / BigLake Analityka ⚠️ Snapshot-level
Dataplex / Data Catalog Zarządzanie metadanymi ✅ Możliwa integracja

Hudi dodaje warstwę:

  • metadanych (co się zmieniło, które pliki należą do której wersji danych)
  • zarządzania plikami (jak scalać i kompresować dane)
  • transakcji i wersjonowania (ACID commits, rollback, time travel)
  • interfejsu odczytu (snapshot, incremental, read-optimized)

Dzięki temu twój data lake zachowuje się jak baza danych – z możliwością upsertów, wersjonowania i odczytu z dowolnego momentu w czasie.

╔══════════════════════════════════════════════╗
║            Apache Hudi Logical Layer         ║
║  (zarządza metadanymi, transakcjami, wersjami) ║
╚══════════════════════════════════════════════╝
                 ↓
╔══════════════════════════════════════════════╗
║   Silniki obliczeniowe: Spark / Flink / Hive ║
╚══════════════════════════════════════════════╝
                 ↓
╔══════════════════════════════════════════════╗
║   Fizyczne przechowywanie: S3 / GCS / HDFS   ║
║   (pliki Parquet + metadane .hoodie)         ║
╚══════════════════════════════════════════════╝

Hudi dostarcza 3 kluczowe rzeczy

  1. Warstwa danych (Data Layer)
  • Dane są zapisane w Parquet + Avro
  • Hudi dba o strukturę katalogów, partycje i pliki
  • Fizyczny storage to np. GCS, S3, HDFS

2️. Warstwa metadanych (Metadata Layer)

  • Przechowuje: Commit log (timeline) Schematy danych Indeksy rekordów (np. Bloom filters) Statystyki Zazwyczaj w katalogu .hoodie/

To pozwala Hudi rozumieć, co się dzieje z plikami, bez konieczności ich pełnego skanowania (czyli duża optymalizacja).

  1. Warstwa dostępu (Access Layer)
  • Ujednolicony interfejs dla:
    • Spark SQL (.format("hudi"))
    • Flink SQL (CREATE TABLE ... WITH ('connector' = 'hudi'))
    • Presto, Trino, Hive, Athena (czytają snapshot)