Introduction to Apache Hudi

 

Introduction to Apache Hudi


Data Lake Integration

  • Hudi có thể đẩy dữ liệu realtime vào các hệ lưu trữ distributed file systems (DFS), như là HDFS hoặc cloud stores ( MinIO )
  • Có thể chứa đc dữ liệu lớn trên file ( parquet, … ), tiết kiệm hơn so với lưu trữ trên các hệ OLAP ( Kudu, Pinot )
  • Tương thích với nhiều loại query engine nên ta có thể dễ dàng query data từ Hudi table

Core Components

  • Tables: Hudi tổ chức data dưới dạng bảng, dễ dàng quản lý và query.
  • Transactions: Hudi hỗ trợ những hoạt động transactional như UPDATE, DELETE ( nếu chỉ dùng Hive thì ko có ) trên từng dòng data. Bảo đảm consistency và durability trong các hành động write data ( Tính chất C và D trong ACID ).
  • Upserts/Deletes: Hudi hỗ trợ update và delete, cho phép bạn thay đổi dòng data hiện tại nhưng ko cần phải xử lý hết toàn bộ dataset ( toàn bộ file )
  • Advanced Indexes: Hudi hỗ trợ đánh index, giúp cải thiện query performance.
  • Streaming Ingestion Services: Hudi hỗ trợ ingest real-time data từ source như Kafka, hỗ trợ stream processing trên data lakes ( HDFS, MinIO, … ).
  • Data Clustering / Compaction Optimizations: Hudi hỗ trợ nén data để cải thiện khả năng lưu trữ.
  • Concurrency: Hudi hỗ trợ concurrent read và write.

Table Types

  • COPY_ON_WRITE (CoW) Table: trong bảng CoW, mỗi hành động write tạo lại 1 phiên bảng mới của toàn bộ dataset, nó thích hợp cho trường hợp data ít khi thay đổi.
  • MERGE_ON_READ (MoR) Table: trong bảng MoR, data mới đc append vào file có sẵn, và các file sẽ đc nén ( lazily ) trong quá trình đọc. nó thích hợp cho trường hợp data update và delete thường xuyên

Query Types

  • Snapshot Queries
    • Loại query này trả ra data được snapshot ngay tại thời điểm câu query đc chạy ( write commit cuối cùng )
    •  Ví dụ: SELECT * FROM hudi_table WHERE _hoodie_commit_time = (SELECT MAX(_hoodie_commit_time) FROM hudi_table);
    • Use case: các nhu cầu cần query data real-time ( report, ... )
  • Incremental Queries:
    • Loại query này sẽ chỉ lấy những data thay đổi ( đc added hoặc updated ) từ thời điểm commit được chỉ định ( chỉ định điều kiện cho cột _hoodie_commit_time )
    • Ví dụ: SELECT * FROM hudi_table WHERE _hoodie_commit_time > '20230601080000';
    • Use case: các pipeline chỉ cần process data mới
  • Read Optimized Queries
    • Loại query này trả ra data ko đạt đến mức real-time hoàn toàn nhưng bù lại có query performance tốt hơn, nó đọc từ kho lưu trữ columnar của Hudi ( Parquet file ), loại query này đc tối ưu để đọc data tối ưu hơn.
    • Ví dụ: SELECT * FROM hudi_table /*+ MERGE_ON_READ_OPTIMIZATION */ WHERE some_column = 'value';
    • Use case: các nhu cầu đọc data nhanh, nhưng độ "real-time" ko cần cao ( các report định kỳ trong đó có thể chấp nhận được sự chậm trễ nhỏ trong data )
  • Time Travel Queries
    • Loại query này cho phép ta query data tại một thời điểm cụ thể trong quá khứ.
    • Ví dụ: SELECT * FROM hudi_table AS OF '20230601080000';
    • Use case:
      • Kiểm tra các thay đổi dữ liệu lịch sử. 
      • Debug bằng cách kiểm tra state của data tại một thời điểm cụ thể trong quá khứ. 
      • Tạo lại các report tại thời điểm quá khứ.
  • Tổng kết:
    • Snapshot Queries: query data mới nhất ( all data mới )
    • Incremental Queries: query data mới nhất đc add hoặc update ( chỉ 1 phần data mới )
    • Read Optimized Queries: tối ưu read performance nhưng đổi lại độ "real-time" của data
    • Time Travel Queries: query các phiên bản lịch sử của data

Performance and Compatibility

  • Tương thích với việc query từ Apache SparkFlinkPrestoTrino, and Hive.
  • Lưu data dưới các dạng file Parquet, Avro, … ⇒ tương thích với nhiều platform

Use Cases and Adoption

  • Hudi được sử dụng rộng rải để làm 1 large scale data lake ở Uber, Amazon, ByteDance, and Robinhood.
  • Không chỉ hỗ trợ streaming workloads mà còn hỗ trợ incremental batch pipelines.

Comments

Popular posts from this blog

Introduction to Apache Doris

Một số câu hỏi về 'difference between'