paint-brush
如何使用 Kubernetes 部署 MinIO 和 Trino经过@minio
4,997 讀數
4,997 讀數

如何使用 Kubernetes 部署 MinIO 和 Trino

经过 MinIO6m2024/05/23
Read on Terminal Reader

太長; 讀書

MinIO 能够处理 AI/ML 和分析领域的大量工作负载,因此可以轻松支持 Trino 查询及其他功能。
featured image - 如何使用 Kubernetes 部署 MinIO 和 Trino
MinIO HackerNoon profile picture
0-item
1-item



特里诺(原名 Presto)是一个 SQL 查询引擎,而不是 SQL 数据库。Trino 摒弃了 SQL 数据库的存储组件,只专注于一件事——超快速 SQL 查询。Trino 只是一个查询引擎,不存储数据。相反,Trino 与各种数据库或直接在对象存储上交互。Trino 解析和分析您传入的 SQL 查询,创建和优化包含数据源的查询执行计划,然后调度能够智能查询其连接到的底层数据库的工作节点。


MinIO 经常用于存储来自 AI/ML 工作负载、数据湖和数据湖的数据,无论是 Dremio、Hive、Hudi、StarRocks 还是其他十几种出色的 AI/ML 工具解决方案。MinIO 在用作主存储层时效率更高,这降低了存储数据的总拥有成本,此外,您还可以获得将数据写入 MinIO 的额外好处,不可变的版本化并受到保护擦除编码。此外,将数据保存到 MinIO 对象存储可使其可供其他云原生机器学习和分析应用程序使用。


在本教程中,我们将部署一个有凝聚力的系统,允许对存储在 Minio 中的大型数据集进行分布式 SQL 查询,其中 Trino 利用来自 Hive Metastore 的元数据和来自 Redis 的表模式。

成分

以下是不同的组件以及它们在我们接下来将介绍的设置过程中所起的作用。


  • Minio: Minio 可用于存储大型数据集,例如 Trino 通常分析的数据集。
  • Hive Metastore :Hive Metastore 是一种存储 Hive 表元数据(如表模式)的服务。Trino 可以在查询数据集时使用 Hive Metastore 来确定表的模式。
  • PostgreSQL for Hive Metastore:这是 Hive Metastore 的数据库后端。元数据实际存储在这里。
  • Redis:在此设置中,Redis 用于存储 Trino 的表模式。
  • Trino: Trino(以前称为 Presto)是一种高性能分布式 SQL 查询引擎。它允许跨各种数据源(如 SQL 数据库、NoSQL 数据库,甚至 Minio 等对象存储)查询数据。

先决条件

开始之前,请确保已安装管理 Kubernetes 集群所需的工具:


  • kubectl :管理 Kubernetes 集群的主要命令行工具。您可以使用它来检查、操作和管理集群资源。
  • helm :Kubernetes 的包管理器。Helm 允许您使用预定义图表部署、升级和管理集群内的应用程序。

存储库克隆

要访问在 Kubernetes 上部署 Trino 所需的资源,请克隆特定的 GitHub 存储库并导航到相应的目录:


 git clone https://github.com/minio/blog-assets.git cd blog-assets/trino-on-kubernetes

Kubernetes 命名空间创建

Kubernetes 中的命名空间为应用程序提供了隔离的环境。为 Trino 创建一个新的命名空间来封装其部署:


 kubectl create namespace trino --dry-run=client -o yaml | kubectl apply -f -

Redis 表定义秘密

Redis 将存储 Trino 使用的表模式。使用 Kubernetes Secret 保护这些模式。以下命令创建一个通用 secret,从 JSON 文件中获取数据:


 kubectl create secret generic redis-table-definition --from-file=redis/test.json -n trino || true


添加 Helm 存储库

Helm 存储库提供预先打包的图表,可简化应用程序部署。将 Bitnami 和 Trino 存储库添加到您的 Helm 配置中:


 helm repo add bitnami https://charts.bitnami.com/bitnami || true helm repo add trino https://trinodb.github.io/charts/ || true

部署 MinIO 进行数据存储

初始化 MinIO

在 Trino 命名空间内准备 MinIO。


 kubectl minio init -n trino

创建 MinIO 租户

设置数据存储的多租户架构。以下示例创建一个名为“tenant-1”的租户,该租户有四台服务器、四个存储卷,容量为 4 GiB:


 kubectl minio tenant create tenant-1 --servers 4 --volumes 4 --capacity 4Gi -n trino

设置 Hive Metastore

Trino 利用 Hive Metastore 存储表元数据。部署 PostgreSQL 来管理元数据,然后设置 Hive Metastore:

安装 PostgreSQL


 helm upgrade --install hive-metastore-postgresql bitnami/postgresql -n trino -f hive-metastore-postgresql/values.yaml

部署 Hive Metastore

使用预配置的 Helm 图表在 Trino 命名空间内部署 Hive Metastore:


 helm upgrade --install my-hive-metastore -n trino -f hive-metastore/values.yaml ./charts/hive-metastore

使用 Kubernetes 部署 MinIO 和 Trino

Trino 和 MinIO 为跨大型数据集的分布式 SQL 查询创建了强大的组合。请按照以下步骤部署和配置系统。

部署 Redis 来存储表架构

Redis 是一种高速内存数据存储,用于保存 Trino 表模式以增强查询性能。使用 Helm 图表将其部署在 Trino 命名空间中:


 helm upgrade --install my-redis bitnami/redis -n trino -f redis/values.yaml


部署 Trino

将 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 租户服务

端口转发到租户的MinIO服务,实现本地访问:


 kubectl port-forward svc/minio -n trino 9443:443

为 Trino 创建别名和存储桶

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

通过端口转发访问 Trino UI

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。



通过 CLI 查询 Trino

访问 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)


确认 MinIO Bucket 中的数据

创建存储桶后,使用 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 有任何疑问,请通过以下方式联系我们松弛