Khái niệm Data Fabric và Lợi ích của Apache Iceberg với Trino
Data Fabric là kiến trúc tích hợp dữ liệu sử dụng các lớp tự động hóa, AI và machine learning để cung cấp khả năng truy cập dữ liệu liền mạch trên nhiều môi trường (hybrid, multi-cloud) mà không cần di chuyển dữ liệu vật lý.
Kết hợp Apache Iceberg (lớp lưu trữ dữ liệu dạng bảng mở - Open Table Format) và Trino (công cụ truy vấn phân tán SQL) tạo ra một Data Fabric hiện đại giúp giải quyết bài toán "Data Silos" và latency.
Iceberg cung cấp tính năng ACID, time-travel, và schema evolution, cho phép các hệ thống khác nhau ghi/đọc cùng một dataset mà không gây xung đột.
Trino đóng vai trò là truy vấn engine, cho phép thực thi các câu lệnh SQL phức tạp ngay lập tức trên dữ liệu nằm trong Iceberg mà không cần build warehouse riêng biệt.
Kiểm tra kiến trúc mục tiêu
Trước khi triển khai, hãy xác nhận bạn đã nắm được luồng dữ liệu: Dữ liệu thô -> S3/MinIO -> Iceberg Catalog -> Trino Engine -> Kết quả trả về.
Yêu cầu Phần cứng và Tài nguyên cho Cụm Kubernetes
Để triển khai cụm Kubernetes ổn định cho Data Fabric, bạn cần đảm bảo tài nguyên tối thiểu cho các thành phần: Kubernetes Control Plane, Worker Nodes, và các ứng dụng (Iceberg REST Catalog, Trino Coordinator/Worker).
Yêu cầu tối thiểu cho môi trường phát triển (Dev/Test) trên 1 node hoặc cụm nhỏ:
- CPU: Tối thiểu 4 vCPU (Khuyên dùng 8 vCPU để chạy Trino Worker cùng lúc).
- RAM: Tối thiểu 16GB (Trino và Iceberg cần nhiều bộ nhớ cho metadata và cache).
- Storage: Tối thiểu 50GB SSD cho local storage (nếu dùng MinIO) hoặc khả năng mount volume mạng.
- Network: Băng thông mạng nội bộ (Internal Network) ít nhất 1Gbps để đảm bảo tốc độ truyền dữ liệu giữa các pod.
Yêu cầu tối thiểu cho môi trường sản xuất (Production) trên EKS/GKE:
- CPU: 8-16 vCPU cho Control Plane, và các Worker Node scale-out tự động (Autoscaling).
- RAM: 32GB+ cho Control Plane, 32GB+ cho mỗi Trino Worker node.
- Storage: Sử dụng object storage (AWS S3, GCS) cho data lake, không lưu trên disk local của node.
Kiểm tra tài nguyên hiện có
Chạy lệnh sau để xem cấu hình node nếu bạn đã có cluster:
kubectl describe node
Kết quả mong đợi: Bạn thấy rõ số lượng CPU (Allocatable) và RAM (Allocatable) đáp ứng mức tối thiểu nêu trên.
Cài đặt và Cấu hình Kubernetes Cluster
Để bắt đầu, chúng ta sẽ thiết lập một cụm Kubernetes. Tùy thuộc vào môi trường, bạn có thể chọn Minikube (cho local laptop) hoặc EKS/GKE (cho cloud).
Phần hướng dẫn này tập trung vào Minikube vì tính nhất quán và khả năng chạy mọi thứ trên một máy Linux duy nhất để debug.
Bước 1: Khởi tạo Minikube với Docker Driver
Minikube cần được khởi tạo với driver Docker để tận dụng container runtime đã có sẵn, đồng thời bật các addon cần thiết cho việc expose service (ingress) và storage (persistent volume).
minikube start --driver=docker --cpus=4 --memory=16384 --disk-size=50g --kubernetes-version=v1.28.0
Kết quả mong đợi: Minikube khởi tạo cluster thành công, hiển thị dòng "Kubernetes v1.28.0" và trạng thái "Running".
Bước 2: Kích hoạt các Add-on cần thiết
Cần bật addon ingress để route traffic vào các service và addon storage-provisioner để tạo Persistent Volume Claim (PVC) động cho các ứng dụng lưu trữ dữ liệu.
minikube addons enable ingress
minikube addons enable storage-provisioner
Kết quả mong đợi: Xuất hiện dòng "ingress: enabled" và "storage-provisioner: enabled".
Bước 3: Cấu hình Context và Context Switching
Đảm bảo kubectl đang trỏ đúng vào cluster vừa tạo để thực thi các lệnh tiếp theo.
kubectl config use-context minikube
Kết quả mong đợi: Dòng thông báo "Switched to context 'minikube'".
Kiểm tra Cluster
Verify rằng các control plane components đã chạy và node trong trạng thái Ready.
kubectl get nodes
kubectl get pods -n kube-system
Kết quả mong đợi: Node có trạng thái "Ready" và các pod trong kube-system có trạng thái "Running".
Chuẩn bị Tài khoản Lưu trữ Dữ liệu (AWS S3 hoặc MinIO)
Data Fabric cần một lớp lưu trữ chung (Shared Storage Layer). Trong môi trường Production, chúng ta dùng AWS S3. Trong môi trường Dev/Local, MinIO là giải pháp thay thế hoàn hảo, tương thích API S3.
Chúng ta sẽ triển khai MinIO trên Kubernetes để đóng vai trò là Object Storage cho Apache Iceberg.
Bước 1: Tạo Namespace riêng cho Storage
Tách biệt namespace giúp quản lý tài nguyên storage độc lập với các ứng dụng xử lý dữ liệu.
kubectl create namespace storage-system
Kết quả mong đợi: Dòng thông báo "namespace/storage-system created".
Bước 2: Tạo Persistent Volume Claim (PVC) cho MinIO
MinIO cần một volume để lưu trữ dữ liệu thực tế. Chúng ta tạo một PVC với kích thước 20GB, sử dụng storage class mặc định của Minikube.
kubectl apply -f -
Kết quả mong đợi: Dòng "persistentvolumeclaim/minio-pvc created".
Bước 3: Triển khai MinIO Server và Console
Sử dụng Helm để cài đặt MinIO, bao gồm cả server và giao diện quản trị (Console). Cấu hình này sẽ mount PVC ở bước trên và tạo bucket mặc định.
Trước tiên, thêm Helm repo của MinIO:
helm repo add minio https://operator.min.io
helm repo update
Cài đặt MinIO với các tham số tùy chỉnh:
helm install minio minio/minio \
--namespace storage-system \
--set mode=distributed \
--set persistence.enabled=true \
--set persistence.storageClass=standard \
--set persistence.size=20Gi \
--set persistence.existingClaim=minio-pvc \
--set rootUser=admin \
--set rootPassword=password123 \
--set console.ingress.enabled=true \
--set console.ingress.hosts[0].host=minio-console.local \
--set console.ingress.pathType=Prefix \
--set ingress.enabled=true \
--set ingress.hosts[0].host=minio.local \
--set ingress.pathType=Prefix
Kết quả mong đợi: Xuất hiện dòng "NAME: minio" và trạng thái các pod chuyển sang "Running".
Bước 4: Tạo Bucket cho Iceberg
Apache Iceberg cần một bucket S3 để lưu trữ metadata và data files. Chúng ta sẽ tạo bucket này ngay sau khi MinIO sẵn sàng.
Chờ pod MinIO chạy xong (khoảng 30-60 giây), sau đó sử dụng mc (MinIO Client) để tạo bucket. Nếu chưa có mc, cài đặt nhanh:
wget https://dl.min.io/client/mc/release/linux-amd64/mc -O /usr/local/bin/mc && chmod +x /usr/local/bin/mc
Cấu hình alias MinIO để kết nối từ host vào container MinIO (cần expose port hoặc dùng kubectl port-forward, ở đây dùng port-forward để nhanh nhất):
export MINIO_ENDPOINT=$(kubectl get pod -n storage-system -l app=minio -o jsonpath='{.items[0].metadata.name}')-minio
kubectl port-forward -n storage-system svc/minio-minio 9000:9000 &
sleep 5
mc alias set myminio http://localhost:9000 admin password123
mc mb myminio/iceberg-data-lake
mc mb myminio/iceberg-catalog-metadata
Kết quả mong đợi: Dòng thông báo "Bucket created successfully..." cho cả 2 bucket.
Dừng port-forward sau khi tạo bucket để giải phóng terminal:
pkill -f "port-forward"
Kiểm tra Bucket
Verify bucket đã được tạo bằng cách liệt kê:
kubectl port-forward -n storage-system svc/minio-minio 9000:9000 &
sleep 2 && mc ls myminio && pkill -f "port-forward"
Kết quả mong đợi: Danh sách bucket hiển thị "iceberg-data-lake" và "iceberg-catalog-metadata".
Cài đặt các Công cụ CLI Cần thiết
Để vận hành và debug hệ thống Data Fabric, bạn cần trang bị các công cụ dòng lệnh: kubectl (quản lý K8s), Helm (quản lý package), và jq (xử lý JSON output).
Bước 1: Cài đặt kubectl
Nếu chưa có kubectl, hãy tải bản mới nhất tương thích với cluster của bạn.
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/kubectl
Kết quả mong đợi: Chạy lệnh `kubectl version --client` trả về phiên bản kubectl mà không báo lỗi.
Bước 2: Cài đặt Helm 3
Helm 3 là công cụ chuẩn để cài đặt các ứng dụng phức tạp như Trino và Iceberg REST Catalog.
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
Kết quả mong đợi: Dòng "HELM_CLIENT_VERSION" hiển thị phiên bản mới nhất (ví dụ v3.12.x) và file binary được đặt vào /usr/local/bin/helm.
Bước 3: Cài đặt jq
jq giúp parse output JSON từ kubectl và API để lọc thông tin cần thiết (như IP address, Pod status).
sudo apt-get update && sudo apt-get install -y jq
Kết quả mong đợi: Chạy lệnh `jq --version` trả về phiên bản (ví dụ jq-1.6).
Kiểm tra môi trường CLI
Verify toàn bộ công cụ đã hoạt động:
kubectl version --client --short
helm version --short
echo '{"key":"value"}' | jq .key
Kết quả mong đợi: Trả về phiên bản của kubectl, helm và giá trị "value" từ jq.
Đ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 1: Giới thiệu kiến trúc Data Fabric và chuẩn bị môi trường Kubernetes
Phần 2: Triển khai Apache Iceberg trên Kubernetes với Iceberg REST Catalog »