Lê Duy Khương (Daniel)

Chuỗi: lakehouse-glossary · Phần 1

Năng suất & công cụ dev

Delta Lake / Apache Iceberg / Apache Hudi — Định dạng bảng cho Lakehouse

Ba định dạng bảng cho Lakehouse: Delta Lake, Iceberg, Hudi. ACID, time travel, schema evolution và khi nào dùng cái nào.

2026-03-172 phút đọcVI


1. Khái niệm

Đây là 3 định dạng lưu trữ dạng bảng (table format) dành cho hệ thống Lakehouse. Chúng giúp tổ chức dữ liệu dạng bảng trên file-based storage (Parquet, ORC) mà vẫn hỗ trợ:

  • ACID transaction (giao dịch)
  • Time travel (truy xuất phiên bản lịch sử)
  • Schema evolution (tiến hóa schema)
  • Metadata indexing (chỉ mục hóa metadata)
Định dạngTổ chức phát triểnƯu điểm đặc trưng
Delta LakeDatabricksACID mạnh, dễ tích hợp Spark, hỗ trợ time travel tốt
IcebergApache FoundationMetadata độc lập, query hiệu quả, tốt cho Presto/Trino
HudiApache FoundationHỗ trợ write/update mạnh, thích hợp cho ingestion dày

2. Mục đích

Trong hệ Lakehouse, file như Parquet không đủ để mô tả "tính sống" của dữ liệu. Table format giải quyết:

  • Dữ liệu cập nhật được (insert/update/delete)
  • Tính nhất quán khi ghi và đọc
  • Khôi phục phiên bản cũ nếu có lỗi

3. Thành phần

  1. Storage Layer: Object Storage (HDFS, S3, GCS, MinIO…)
  2. Table Format Layer: Delta / Iceberg / Hudi
  3. Compute Engine: Spark, Flink, Presto, Trino, Dremio
  4. Catalog: Hive Metastore, AWS Glue, Nessie, Unity Catalog

4. Ứng dụng (Use cases)

Use CaseMô tả
1. Update bảng khách hàngGhi đè dữ liệu mới thay vì ghi chồng
2. Time travelTruy xuất phiên bản bảng tại thời điểm T
3. ACID TransactionGộp insert/update/delete thành một giao dịch duy nhất
4. Xử lý dữ liệu tuần tựGhi batch hoặc stream với consistency
5. Khôi phục sau lỗiRollback về phiên bản ổn định sau lỗi dữ liệu

5. Sample code (Delta Lake + Spark)

from pyspark.sql import SparkSession
 
spark = SparkSession.builder \
    .appName("DeltaLakeExample") \
    .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \
    .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") \
    .getOrCreate()
 
# Ghi dữ liệu dưới định dạng Delta
df.write.format("delta").mode("overwrite").save("/data/delta/customers")
 
# Đọc và truy vấn time travel
df_v1 = spark.read.format("delta").option("versionAsOf", 1).load("/data/delta/customers")

6. Sơ đồ kiến trúc tích hợp

┌──────────────┐       ┌──────────────┐
│ Spark/Flink  │──────▶│ Delta / Iceberg / Hudi │────▶ Object Storage (Parquet)
└──────────────┘       └──────────────┘
         │                       │
         ▼                       ▼
     Time Travel           Update/Delete

7. Hành động tiếp theo

  1. Học cấu trúc thư mục và file manifest của Iceberg, Delta và Hudi
  2. Viết Spark pipeline ghi dữ liệu vào Delta và time travel
  3. So sánh performance Iceberg vs Delta vs Hudi
  4. Đọc tài liệu: Iceberg Spec, Delta Lake Docs
  5. Thử tích hợp 1 engine query như Trino hoặc Dremio vào Delta table
LDK

Le Duy Khuong

AI Transformation & Digital Strategy. Writing about agentic systems, engineering leadership, and building in public.