Kiến trúc cụm Trino: Coordinator, Worker và Catalog
Trino hoạt động theo mô hình Client-Server, nơi các node được chia thành hai vai trò chính: Coordinator và Worker.
Role Coordinator chịu trách nhiệm tiếp nhận truy vấn từ client, phân tích cú pháp (parsing), tối ưu hóa (planning) và phân phối các fragment công việc cho các Worker. Đây là node duy nhất cần mở cổng giao diện web (8080).
Role Worker thực thi các fragment được phân phối, thực hiện đọc dữ liệu từ storage (S3, HDFS, hoặc Iceberg REST Catalog) và trả về kết quả về Coordinator để tổng hợp.
Catalog trong Trino đóng vai trò là cầu nối logic để ánh xạ database và table vào hệ thống storage vật lý. Trong kiến trúc Data Fabric này, chúng ta sẽ cấu hình Catalog Iceberg để Trino giao tiếp với Iceberg REST Catalog đã triển khai ở phần trước.
Triển khai Trino trên Kubernetes sử dụng Helm Chart
Chúng ta sẽ sử dụng Helm Chart chính thức từ repository Trino để triển khai cụm gồm 1 Coordinator và 2 Worker để đảm bảo tính sẵn sàng và khả năng mở rộng.
Trước tiên, thêm repository của Trino vào Helm client để tải các manifest file cần thiết.
helm repo add trino https://trino.io/helm-charts
helm repo update
Kết quả mong đợi: Thông báo "Hangar added successfully" và danh sách các chart được cập nhật.
Tạo thư mục cấu hình riêng cho Trino để quản lý các file values.yaml một cách gọn gàng.
mkdir -p trino-deploy && cd trino-deploy
Kết quả mong đợi: Chuyển thư mục thành công vào trino-deploy.
Khởi tạo file values.yaml với cấu hình mặc định để xác định số lượng node và các thông số cơ bản.
helm pull trino/trino --untar --version 1.5.0
Kết quả mong đợi: Thư mục trino được tạo ra chứa các template và file values.yaml.
Chỉnh sửa file values.yaml để định nghĩa rõ ràng các node. Tại đây, chúng ta cấu hình 1 Coordinator và 2 Worker, đồng thời chỉ định resource request/limit phù hợp cho môi trường sản xuất.
cat > trino-values.yaml
Kết quả mong đợi: File trino-values.yaml được tạo thành công với nội dung cấu hình.
Triển khai cụm Trino vào namespace 'data-fabric' đã tạo ở phần trước.
helm install trino ./trino -n data-fabric -f trino-values.yaml
Kết quả mong đợi: Thông báo "NAME: trino" và trạng thái "DEPLOYED".
Verify: Kiểm tra trạng thái của các Pod để đảm bảo Coordinator và Worker đều ở trạng thái Running.
kubectl get pods -n data-fabric | grep trino
Kết quả mong đợi: Xuất hiện 3 pod (1 trino-coordinator-0, 2 trino-worker-*) với trạng thái READY 1/1 và STATUS Running.
Cấu hình Trino Catalog để kết nối với Iceberg REST Catalog
Để Trino có thể đọc dữ liệu Iceberg, chúng ta cần tạo một catalog trong Trino chỉ trỏ đến Iceberg REST Catalog đã chạy ở Phần 2.
Trong Kubernetes, cách tốt nhất để inject cấu hình vào Trino là sử dụng ConfigMap và mount vào container thông qua volume, hoặc chỉnh sửa trực tiếp trong values.yaml. Ở đây, chúng ta sẽ tạo ConfigMap để linh hoạt quản lý catalog.
Tạo file cấu hình catalog iceberg với thông tin endpoint của Iceberg REST Catalog. Lưu ý thay thế YOUR_CATALOG_URL bằng URL thực tế (ví dụ: http://iceberg-rest-catalog.data-fabric.svc.cluster.local:8181).
cat > /tmp/iceberg-catalog.properties
Kết quả mong đợi: File iceberg-catalog.properties được tạo tại /tmp.
Tạo ConfigMap từ file cấu hình này và gắn nó vào namespace data-fabric.
kubectl create configmap trino-catalog-iceberg -n data-fabric --from-file=/tmp/iceberg-catalog.properties
Kết quả mong đợi: ConfigMap "trino-catalog-iceberg" được tạo thành công.
Bây giờ, cập nhật file values.yaml để Trino nhận diện ConfigMap này. Chúng ta cần thêm volume mount vào container Coordinator và Worker, và chỉ định thư mục catalog trong Trino.
cat > trino-values-updated.yaml
Kết quả mong đợi: File trino-values-updated.yaml được tạo với cấu hình volume mount.
Thực hiện upgrade Helm release để áp dụng cấu hình mới. Trino sẽ tự động restart để tải lại catalog.
helm upgrade trino ./trino -n data-fabric -f trino-values-updated.yaml
Kết quả mong đợi: Thông báo "Release 'trino' has been upgraded" và các pod sẽ restart.
Verify: Kiểm tra xem file catalog đã được mount đúng vị trí trong container Coordinator chưa.
kubectl exec -it trino-coordinator-0 -n data-fabric -- ls -l /etc/trino/catalog/
Kết quả mong đợi: Xuất hiện file "iceberg.properties" trong thư mục /etc/trino/catalog/.
Tối ưu hóa cấu hình Trino cho việc truy vấn dữ liệu lớn
Khi làm việc với dữ liệu lớn (Big Data) trong Iceberg, hiệu năng của Trino phụ thuộc rất nhiều vào việc cấu hình JVM và các tham số tối ưu hóa query.
Cấu hình file environment.properties để điều chỉnh kích thước buffer và số lượng thread. File này giúp Trino xử lý hiệu quả hơn với các dataset lớn và giảm tình trạng OOM (Out Of Memory).
cat > /tmp/environment.properties
Kết quả mong đợi: File environment.properties được tạo.
Tạo ConfigMap cho file environment.properties và cập nhật vào Helm Chart.
kubectl create configmap trino-environment -n data-fabric --from-file=/tmp/environment.properties
Kết quả mong đợi: ConfigMap "trino-environment" được tạo thành công.
Cập nhật values.yaml một lần nữa để mount thêm file environment.properties vào thư mục /etc/trino/.
cat > trino-values-final.yaml
Kết quả mong đợi: File trino-values-final.yaml được tạo.
Upgrade cụm Trino để áp dụng các thay đổi tối ưu hóa.
helm upgrade trino ./trino -n data-fabric -f trino-values-final.yaml
Kết quả mong đợi: Cluster được upgrade và restart để áp dụng cấu hình mới.
Verify: Kiểm tra xem file environment đã được mount đúng vị trí trong container Worker.
kubectl exec -it trino-worker-0 -n data-fabric -- cat /etc/trino/environment.properties
Kết quả mong đợi: Nội dung file environment.properties được hiển thị đầy đủ.
Kiểm tra kết nối giữa Trino và Iceberg bằng truy vấn mẫu
Sau khi hoàn tất cấu hình, bước cuối cùng là xác nhận Trino có thể giao tiếp với Iceberg REST Catalog và đọc dữ liệu.
Expose service Trino Coordinator ra ngoài để truy cập từ máy local (nếu cần) hoặc từ trong cluster. Ở đây, chúng ta sẽ port-forward để truy cập nhanh.
kubectl port-forward -n data-fabric svc/trino-coordinator 8080:8080 &
Kết quả mong đợi: Thông báo "Forwarding from 127.0.0.1:8080 -> 8080" và quá trình chạy ngầm.
Sử dụng client Trino CLI hoặc truy vấn trực tiếp qua web UI để kiểm tra. Đầu tiên, đăng nhập vào Trino CLI (cần cài đặt trino-cli trên máy local) hoặc dùng curl để test endpoint.
trino --server localhost:8080 --catalog iceberg_catalog
Kết quả mong đợi: Prompt của Trino CLI xuất hiện, ví dụ: "trino:iceberg_catalog>".
Thực hiện truy vấn SHOW SCHEMAS để liệt kê các schema có trong catalog Iceberg đã kết nối.
SHOW SCHEMAS;
Kết quả mong đợi: Danh sách các schema (ví dụ: default, demo_data) được hiển thị nếu Iceberg REST Catalog đã có dữ liệu.
Thực hiện truy vấn SHOW TABLES để liệt kê các bảng trong schema cụ thể.
SHOW TABLES FROM default;
Kết quả mong đợi: Danh sách các bảng Iceberg (ví dụ: user_events, sales_data) được hiển thị.
Thực hiện truy vấn SELECT mẫu để đọc dữ liệu thực tế từ bảng Iceberg, xác nhận tính toàn vẹn của dữ liệu.
SELECT COUNT(*) FROM default.user_events;
Kết quả mong đợi: Trả về số lượng dòng dữ liệu (row count) chính xác, chứng tỏ Trino đã đọc thành công từ Iceberg REST Catalog.
Kiểm tra hiệu năng truy vấn bằng cách xem thời gian thực thi. Nếu kết quả trả về trong vài giây với dữ liệu lớn, cấu hình tối ưu đã thành công.
EXPLAIN SELECT COUNT(*) FROM default.user_events;
Kết quả mong đợi: Hiển thị kế hoạch thực thi (query plan) của Trino, bao gồm các bước Scan, Filter, Aggregate.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Data Fabric hiện đại với Apache Iceberg, Trino và Kubernetes
« Phần 2: Triển khai Apache Iceberg trên Kubernetes với Iceberg REST Catalog
Phần 3: Triển khai Trino trên Kubernetes để truy vấn dữ liệu Iceberg »