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 Spark, Flink, Presto, Trino, 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
Post a Comment