MinIO 经常用于存储来自 AI/ML 工作负载、数据湖和数据湖的数据,无论是 Dremio、Hive、Hudi、StarRocks 还是其他十几种出色的 AI/ML 工具解决方案。MinIO 在用作主存储层时效率更高,这降低了存储数据的总拥有成本,此外,您还可以获得将数据写入 MinIO 的额外好处,
在本教程中,我们将部署一个有凝聚力的系统,允许对存储在 Minio 中的大型数据集进行分布式 SQL 查询,其中 Trino 利用来自 Hive Metastore 的元数据和来自 Redis 的表模式。
以下是不同的组件以及它们在我们接下来将介绍的设置过程中所起的作用。
开始之前,请确保已安装管理 Kubernetes 集群所需的工具:
要访问在 Kubernetes 上部署 Trino 所需的资源,请克隆特定的 GitHub 存储库并导航到相应的目录:
git clone https://github.com/minio/blog-assets.git cd blog-assets/trino-on-kubernetes
Kubernetes 中的命名空间为应用程序提供了隔离的环境。为 Trino 创建一个新的命名空间来封装其部署:
kubectl create namespace trino --dry-run=client -o yaml | kubectl apply -f -
Redis 将存储 Trino 使用的表模式。使用 Kubernetes Secret 保护这些模式。以下命令创建一个通用 secret,从 JSON 文件中获取数据:
kubectl create secret generic redis-table-definition --from-file=redis/test.json -n trino || true
Helm 存储库提供预先打包的图表,可简化应用程序部署。将 Bitnami 和 Trino 存储库添加到您的 Helm 配置中:
helm repo add bitnami https://charts.bitnami.com/bitnami || true helm repo add trino https://trinodb.github.io/charts/ || true
在 Trino 命名空间内准备 MinIO。
kubectl minio init -n trino
设置数据存储的多租户架构。以下示例创建一个名为“tenant-1”的租户,该租户有四台服务器、四个存储卷,容量为 4 GiB:
kubectl minio tenant create tenant-1 --servers 4 --volumes 4 --capacity 4Gi -n trino
Trino 利用 Hive Metastore 存储表元数据。部署 PostgreSQL 来管理元数据,然后设置 Hive Metastore:
helm upgrade --install hive-metastore-postgresql bitnami/postgresql -n trino -f hive-metastore-postgresql/values.yaml
使用预配置的 Helm 图表在 Trino 命名空间内部署 Hive Metastore:
helm upgrade --install my-hive-metastore -n trino -f hive-metastore/values.yaml ./charts/hive-metastore
Trino 和 MinIO 为跨大型数据集的分布式 SQL 查询创建了强大的组合。请按照以下步骤部署和配置系统。
Redis 是一种高速内存数据存储,用于保存 Trino 表模式以增强查询性能。使用 Helm 图表将其部署在 Trino 命名空间中:
helm upgrade --install my-redis bitnami/redis -n trino -f redis/values.yaml
将 Trino 部署为分布式 SQL 查询引擎,连接到 MinIO 和其他数据源:
helm upgrade --install my-trino trino/trino --version 0.7.0 --namespace trino -f trino/values.yaml
通过列出 Trino 命名空间中的 pod 来确认所有组件都在正确运行:
kubectl get pods -n trino
安全审查与调整
根据需要检查并调整安全设置。要禁用 S3 连接的 SSL 证书验证,请使用以下属性更新 values.yaml 文件的 additionalCatalogs 部分:
hive.s3.ssl.enabled=false
端口转发到租户的MinIO服务,实现本地访问:
kubectl port-forward svc/minio -n trino 9443:443
1. 创建别名:使用 MinIO 部署中的凭据为租户建立别名:
mc alias set my-minio https://localhost:9443/ minio_access_key minio_secret_key --insecure
2. 创建 Bucket:创建 Trino 将使用的新 Bucket
mc mb my-minio/tiny --insecure
1. 获取 Pod 名称:检索 Trino 协调器 Pod 的名称:
export POD_NAME=$(kubectl get pods --namespace trino -l "app=trino,release=my-trino,component=coordinator" -o jsonpath="{.items[0].metadata.name}")
2. 端口转发:将本地端口 8080 转发到协调器 pod:
kubectl port-forward $POD_NAME 8080:8080
3. 访问 UI:在浏览器中访问 http://127.0.0.1:8080 使用 Trino UI。
访问 Trino 协调器 pod 并通过命令行开始查询:
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)
创建存储桶后,使用 mc 命令行工具列出内容,确认数据已存储在 MinIO 中。使用以下命令:
mc ls my-minio/tiny --insecure
就这么简单!
在解决配置问题(尤其是与安全有关的问题)时,请彻底检查每个组件的 values.yaml 文件以确保设置正确。
Trino 的突出之处在于它能够优化跨各种数据层(无论是专用数据库还是对象存储)的查询。它旨在通过下推查询以仅检索所需的基本数据来最大限度地减少数据传输。这使 Trino 能够连接来自不同来源的数据集、执行进一步处理或高效地返回精确结果。
MinIO 凭借其业界领先的可扩展性和性能与 Trino 完美搭配。MinIO 能够处理 AI/ML 和分析领域的大量工作负载,可轻松支持 Trino 查询及其他功能。在最近的基准测试中,MinIO 在 32 个节点上实现了令人印象深刻的 GET 操作 325 GiB/s(349 GB/s)和 PUT 操作 165 GiB/s(177 GB/s)。这种卓越的性能可确保存储在 MinIO 中的数据始终易于访问,使 MinIO 成为 Trino 可靠且高性能的选择,而不会成为瓶颈。
如果您对 MinIO 和 Trino 有任何疑问,请通过以下方式联系我们