Cấu hình Hive Metastore để hỗ trợ truy vấn Hudi qua Presto/Trino
Thiết lập Hive Metastore với Hudi Metastore Handler
Để Presto/Trino có thể đọc dữ liệu Hudi, Hive Metastore cần được cấu hình để nhận diện các bảng Hudi. Chúng ta cần thêm handler Hudi vào cấu hình Hive.
Mục đích: Cho phép Hive Metastore hiểu các metadata đặc thù của Hudi (commit time, timeline) để truyền tải cho engine truy vấn.
Kết quả mong đợi: Hive Metastore trả về thông tin bảng Hudi chính xác khi được yêu cầu.
Chỉnh sửa file cấu hình Hive `hive-site.xml` tại đường dẫn `/etc/hive/conf/hive-site.xml`.
vi /etc/hive/conf/hive-site.xml
Thêm các property sau vào phần trong file:
<property>
<name>hive.metastore.hive.llap.enabled</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://your-hive-metastore-host:9083</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>hdfs://your-namenode:9000/warehouse</value>
</property>
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>true</value>
</property>
Tiếp theo, đảm bảo thư viện `hudi-hadoop-mr-bundle` và `hudi-hive-metastore` nằm trong thư mục `hive/lib`.
cp /opt/hudi/hudi-hadoop-mr-bundle-*.jar /etc/hive/lib/
cp /opt/hudi/hudi-hive-metastore-*.jar /etc/hive/lib/
Khởi động lại dịch vụ Hive Metastore.
systemctl restart hive-metastore
Verify: Chạy lệnh `hive --beeline -u jdbc:hive2://your-hive-metastore-host:10000 -n hive -p hive` và thực hiện lệnh `show tables;`. Nếu bảng Hudi xuất hiện, cấu hình thành công.
Cấu hình Presto/Trino Connector cho Hive
Presto/Trino cần connector Hive để kết nối vào Hive Metastore đã cấu hình ở bước trên. Connector này cần biết đường dẫn đến các JAR Hudi để parse schema động.
Mục đích: Kích hoạt khả năng đọc dữ liệu Hudi (hudi.parquet) của Presto/Trino thông qua Hive Metastore.
Kết quả mong đợi: Presto/Trino có thể chạy câu lệnh SQL `SELECT * FROM table_name` trên dữ liệu Hudi.
Tạo file cấu hình connector tại `/etc/presto/etc/catalog/hive.properties` (hoặc `/etc/trino/etc/catalog/hive.properties`).
connector.name=hive
hive.metastore.uri=thrift://your-hive-metastore-host:9083
hive.metastore-cache-ttl=0s
hive.metastore-refresh-interval=1s
hive.metastore-refresh-max-workers=4
hive.metastore-refresh-batch-size=500
hive.metastore-refresh-threshold=200
hive.metastore-cache-enabled=true
hive.metastore-cache-enabled=true
hive.s3.block-size=64MB
hive.s3.partitioned-read=true
hive.s3.max-connections=100
hive.s3.max-transfer-threads=10
hive.s3.read-throughput-mb-per-second=100
hive.s3.write-throughput-mb-per-second=100
hive.s3.max-retries=3
hive.s3.max-retry-delay=30s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3.max-retry-wait-time=300s
hive.s3
Điều hướng series:
Mục lục: Series: Triển khai Database Lakehouse với Apache Hudi và Ubuntu 24.04
« Phần 6: Tối ưu hóa hiệu năng: Compaction, Clustering và Indexing
Phần 8: Giải quyết sự cố (Troubleshooting) và các mẹo nâng cao »