MinIO thường được sử dụng để lưu trữ dữ liệu từ Khối lượng công việc AI/ML, Datalakes đến các hồ chứa cho dù đó là Dremio, Hive, Hudi, StarRocks hay bất kỳ giải pháp công cụ AI/ML tuyệt vời nào khác. MinIO hiệu quả hơn khi được sử dụng làm lớp lưu trữ chính, giúp giảm tổng chi phí sở hữu đối với dữ liệu được lưu trữ, đồng thời bạn còn nhận được các lợi ích bổ sung khi ghi dữ liệu vào MinIO.
Trong hướng dẫn này, chúng tôi sẽ triển khai một hệ thống gắn kết cho phép truy vấn SQL phân tán trên các tập dữ liệu lớn được lưu trữ trong Minio, với Trino tận dụng siêu dữ liệu từ Hive Metastore và các lược đồ bảng từ Redis.
Các thành phần
Dưới đây là các thành phần khác nhau và chức năng của chúng trong quá trình thiết lập mà chúng ta sẽ tìm hiểu tiếp theo.
- Minio: Minio có thể được sử dụng để lưu trữ các tập dữ liệu lớn, giống như các tập dữ liệu thường được Trino phân tích.
- Hive Metastore : Hive Metastore là dịch vụ lưu trữ siêu dữ liệu cho các bảng Hive (như lược đồ bảng). Trino có thể sử dụng Hive Metastore để xác định lược đồ của các bảng khi truy vấn tập dữ liệu.
- PostgreSQL for Hive Metastore: Đây là phần phụ trợ cơ sở dữ liệu cho Hive Metastore. Đó là nơi siêu dữ liệu thực sự được lưu trữ.
- Redis: Trong thiết lập này, Redis để lưu trữ các lược đồ bảng cho Trino.
- Trino: Trino (trước đây gọi là Presto) là một công cụ truy vấn SQL phân tán, hiệu suất cao. Nó cho phép truy vấn dữ liệu trên nhiều nguồn dữ liệu khác nhau như cơ sở dữ liệu SQL, cơ sở dữ liệu NoSQL và thậm chí cả bộ lưu trữ đối tượng như Minio.
Điều kiện tiên quyết
Trước khi bắt đầu, hãy đảm bảo bạn đã cài đặt các công cụ cần thiết để quản lý cụm Kubernetes của mình:
- kubectl : Công cụ dòng lệnh chính để quản lý cụm Kubernetes. Bạn có thể sử dụng nó để kiểm tra, thao tác và quản lý tài nguyên cụm.
- helm : Trình quản lý gói cho Kubernetes. Helm cho phép bạn triển khai, nâng cấp và quản lý các ứng dụng trong cụm của mình bằng các biểu đồ được xác định trước.
Nhân bản kho lưu trữ
Để truy cập các tài nguyên cần thiết để triển khai Trino trên Kubernetes, hãy sao chép kho GitHub cụ thể và điều hướng đến thư mục thích hợp:
git clone https://github.com/minio/blog-assets.git cd blog-assets/trino-on-kubernetes
Tạo không gian tên Kubernetes
Không gian tên trong Kubernetes cung cấp môi trường biệt lập cho các ứng dụng. Tạo một không gian tên mới cho Trino để gói gọn quá trình triển khai của nó:
kubectl create namespace trino --dry-run=client -o yaml | kubectl apply -f -
Bí mật định nghĩa bảng Redis
Redis sẽ lưu trữ các lược đồ bảng được Trino sử dụng. Bảo mật các lược đồ này bằng Bí mật Kubernetes. Lệnh sau tạo một bí mật chung, tìm nguồn dữ liệu từ tệp JSON:
kubectl create secret generic redis-table-definition --from-file=redis/test.json -n trino || true
Thêm kho lưu trữ Helm
Kho lưu trữ Helm cung cấp các biểu đồ đóng gói sẵn giúp đơn giản hóa việc triển khai ứng dụng. Thêm kho lưu trữ Bitnami và Trino vào cấu hình Helm của bạn:
helm repo add bitnami https://charts.bitnami.com/bitnami || true helm repo add trino https://trinodb.github.io/charts/ || true
Triển khai MinIO để lưu trữ dữ liệu
Khởi tạo MinIO
Chuẩn bị MinIO trong không gian tên Trino.
kubectl minio init -n trino
Tạo đối tượng thuê MinIO
Thiết lập kiến trúc nhiều người thuê để lưu trữ dữ liệu. Ví dụ bên dưới tạo một đối tượng thuê có tên là “tenant-1” với bốn máy chủ, bốn ổ lưu trữ và dung lượng 4 GiB:
kubectl minio tenant create tenant-1 --servers 4 --volumes 4 --capacity 4Gi -n trino
Thiết lập Hive Metastore
Trino sử dụng Hive Metastore để lưu trữ siêu dữ liệu bảng. Triển khai PostgreSQL để quản lý siêu dữ liệu, sau đó thiết lập Hive Metastore:
Cài đặt PostgreSQL
helm upgrade --install hive-metastore-postgresql bitnami/postgresql -n trino -f hive-metastore-postgresql/values.yaml
Triển khai Hive Metastore
Sử dụng biểu đồ Helm được cấu hình sẵn để triển khai Hive Metastore trong không gian tên Trino:
helm upgrade --install my-hive-metastore -n trino -f hive-metastore/values.yaml ./charts/hive-metastore
Triển khai MinIO và Trino với Kubernetes
Trino và MinIO tạo ra sự kết hợp mạnh mẽ để truy vấn SQL phân tán trên các tập dữ liệu lớn. Thực hiện theo các bước sau để triển khai và cấu hình hệ thống.
Triển khai Redis để lưu trữ các lược đồ bảng
Redis là kho lưu trữ dữ liệu trong bộ nhớ, tốc độ cao, dùng để chứa các lược đồ bảng Trino nhằm nâng cao hiệu suất truy vấn. Triển khai nó trong không gian tên Trino bằng biểu đồ Helm:
helm upgrade --install my-redis bitnami/redis -n trino -f redis/values.yaml
Triển khai Trino
Triển khai Trino làm công cụ truy vấn SQL phân tán sẽ kết nối với MinIO và các nguồn dữ liệu khác:
helm upgrade --install my-trino trino/trino --version 0.7.0 --namespace trino -f trino/values.yaml
Xác minh triển khai
Xác nhận rằng tất cả các thành phần đang chạy chính xác bằng cách liệt kê các nhóm trong không gian tên Trino:
kubectl get pods -n trino
Đánh giá và điều chỉnh bảo mật
Xem xét và điều chỉnh cài đặt bảo mật nếu cần. Để tắt xác thực chứng chỉ SSL cho các kết nối S3, hãy cập nhật phần AddedCatalogs của tệp value.yaml với thuộc tính sau:
hive.s3.ssl.enabled=false
Kiểm tra
Chuyển tiếp cổng tới dịch vụ người thuê MinIO
Chuyển tiếp tới dịch vụ MinIO của đối tượng thuê, cho phép truy cập cục bộ:
kubectl port-forward svc/minio -n trino 9443:443
Tạo bí danh và nhóm cho Trino
1. Tạo bí danh: Thiết lập bí danh cho đối tượng thuê bằng thông tin đăng nhập từ quá trình triển khai MinIO:
mc alias set my-minio https://localhost:9443/ minio_access_key minio_secret_key --insecure
2. Create Bucket: Tạo một Bucket mới mà Trino sẽ sử dụng
mc mb my-minio/tiny --insecure
Truy cập Trino UI qua Port Forward
1. Lấy tên Pod: Lấy tên của nhóm điều phối viên Trino:
export POD_NAME=$(kubectl get pods --namespace trino -l "app=trino,release=my-trino,component=coordinator" -o jsonpath="{.items[0].metadata.name}")
2. Chuyển tiếp cổng: Chuyển tiếp cổng cục bộ 8080 tới nhóm điều phối:
kubectl port-forward $POD_NAME 8080:8080
3. Truy cập UI: Sử dụng Trino UI trong trình duyệt của bạn bằng cách truy cập http://127.0.0.1:8080.
Truy vấn Trino qua CLI
Truy cập nhóm điều phối Trino và bắt đầu truy vấn thông qua dòng lệnh:
kubectl exec -it deploy/my-trino-coordinator -n trino -- trino
SHOW CATALOGS;
SHOW SCHEMAS IN minio;
Schema -------------------- default information_schema
CREATE SCHEMA minio.tiny WITH (location = 's3a://tiny/');
CREATE TABLE minio.tiny.customer WITH ( format = 'ORC', external_location = 's3a://tiny/customer/' ) AS SELECT * FROM tpch.tiny.customer;
SELECT * FROM minio.tiny.customer LIMIT 50;
SHOW SCHEMAS IN minio;
Schema -------------------- default information_schema tiny (3 rows)
Xác nhận dữ liệu trong nhóm MinIO
Sau khi tạo nhóm, hãy xác nhận rằng dữ liệu được lưu trữ trong MinIO bằng cách liệt kê nội dung bằng công cụ dòng lệnh mc. Sử dụng lệnh sau:
mc ls my-minio/tiny --insecure
Nó đơn giản như vậy!
suy nghĩ cuối cùng
Khi khắc phục sự cố cấu hình, đặc biệt là các vấn đề liên quan đến bảo mật, hãy xem xét kỹ lưỡng các tệp value.yaml cho từng thành phần để đảm bảo cài đặt phù hợp.
Trino nổi bật nhờ khả năng tối ưu hóa các truy vấn trên nhiều lớp dữ liệu khác nhau, cho dù là cơ sở dữ liệu chuyên dụng hay lưu trữ đối tượng. Nó nhằm mục đích giảm thiểu việc truyền dữ liệu bằng cách đẩy các truy vấn xuống để chỉ lấy những dữ liệu cần thiết. Điều này cho phép Trino kết hợp các tập dữ liệu từ các nguồn khác nhau, thực hiện xử lý thêm hoặc trả về kết quả chính xác một cách hiệu quả.
MinIO kết hợp đặc biệt tốt với Trino nhờ khả năng mở rộng và hiệu suất dẫn đầu ngành. Với khả năng xử lý khối lượng công việc đáng kể trên AI/ML và phân tích, MinIO dễ dàng hỗ trợ các truy vấn Trino và hơn thế nữa. Trong các điểm chuẩn gần đây, MinIO đã đạt được tốc độ ấn tượng 325 GiB/s (349 GB/s) cho các hoạt động GET và 165 GiB/s (177 GB/s) cho các hoạt động PUT chỉ trên 32 nút. Hiệu suất vượt trội này đảm bảo rằng dữ liệu được lưu trữ trong MinIO vẫn có thể truy cập dễ dàng, khiến MinIO trở thành sự lựa chọn đáng tin cậy và hiệu suất cao cho Trino mà không trở thành nút thắt cổ chai.
Nếu bạn có bất kỳ câu hỏi nào về MinIO và Trino, hãy liên hệ với chúng tôi trên