Kubernetes 上的 Dremio 和 MinIO,助力快速可扩展分析

像 MinIO 这样的云原生对象存储经常用于构建数据湖,数据湖将大量结构化、半结构化和非结构化数据存储在一个中心存储库中。数据湖通常包含从多个来源(包括流式和 ETL)获得的原始数据。组织分析这些数据以发现趋势并衡量业务健康状况。
什么是 Dremio?
Dremio 是一个开源的分布式分析引擎,它提供了一个简单、自助的服务界面,用于数据探索、转换和协作。Dremio 的架构构建在 Apache Arrow(一种高性能的列式内存格式)之上,并利用 Parquet 文件格式进行高效存储。有关 Dremio 的更多信息,请参阅 Dremio 入门指南。
用于云原生数据湖的 MinIO
MinIO 是一种为云原生应用程序设计的高性能分布式对象存储系统。可扩展性和高性能的结合使所有工作负载(无论多么苛刻)都触手可及。 最近的一项基准测试 在仅使用 32 个现成的 NVMe SSD 节点的 GET 操作中实现了 325 GiB/s(349 GB/s),在 PUT 操作中实现了 165 GiB/s(177 GB/s)。
MinIO 旨在为数据湖以及在其之上运行的分析和 AI 提供动力。MinIO 包括许多针对处理由许多小文件组成的大型数据集的 优化,这是当今任何开放式表格格式的常见情况。
也许对数据湖来说更重要的是,MinIO 保证了 持久性 和 不变性。此外,MinIO 会 在传输过程中 和 在驱动器上 对数据进行加密,并使用 IAM 和基于策略的访问控制 (PBAC) 来规范对数据的访问。
在 Kubernetes 中设置 Dremio OSS
我们可以使用 Helm 图表在 Kubernetes 集群中部署 Dremio。在这种情况下,我们将使用 Dremio OSS(开源软件)镜像部署一个 Master、三个 Executor 和三个 Zookeeper。Master 节点协调集群,Executor 处理数据。通过部署多个 Executor,我们可以并行化数据处理并提高集群性能。
我们将使用 MinIO 存储桶来存储数据。上传到 Dremio 的新文件存储在 MinIO 存储桶中。这使我们能够以可扩展和分布式的方式存储和处理大量数据。
先决条件
要按照这些说明操作,您需要
- 一个 Kubernetes 集群。您可以使用 Minikube 或 Kind 设置本地 Kubernetes 集群。
- Helm,Kubernetes 的包管理器。您可以按照 本指南 在您的机器上安装 Helm。
- 在 裸机 或 kubernetes 上运行的 MinIO 服务器,或者您可以使用我们的 Play 服务器 进行测试。
- 一个 MinIO 客户端 (mc) 用于访问 MinIO 服务器。您可以按照 本指南 在您的机器上安装 mc。
克隆 minio/openlake 仓库
MinIO 工程师整理了 openlake 仓库,为您提供构建开源数据湖的工具。此仓库的总体目标是指导您完成使用开源工具(如 Apache Spark、Apache Kafka、Trino、Apache Iceberg、Apache Airflow 等)以及在 Kubernetes 上部署的 MinIO 作为对象存储来构建数据湖所需的步骤。
!git clone https://github.com/minio/openlake
创建 MinIO 存储桶
让我们创建一个名为 openlake/dremio
的 MinIO 存储桶,Dremio 将将其用作分布式存储
克隆 dremio-cloud-tools 仓库
我们将使用 Dremio 仓库中的 helm 图表来设置它
我们将使用图表的 dremio_v2
版本,并将使用 openlake 存储库的 Dremio 目录中的 values.minio.yaml
文件来设置 Dremio。让我们将 YAML 复制到 dremio-cloud-tools/charts/dremio_v2
,然后确认它已复制
部署细节
如果我们深入研究 values.minio.yaml
文件(您可以随意使用 cat
或在您选择的编辑器中打开文件),我们将对我们的部署有更深入的了解,并了解对 distStorage
部分进行的一些修改
我们将 distStorage
设置为 aws
,存储桶名称为 openlake
,Dremio 的所有存储都将在前缀 dremio
下(即 s3://openlake/dremio
)。由于我们指定了 MinIO 端点,因此还需要添加 extraProperties
。为了使 Dremio 与 MinIO 一起工作,我们还需要添加两个额外的属性:fs.s3a.path.style.access
需要设置为 true,并且 dremio.s3.compat
必须设置为 true,以便 Dremio 知道这是一个与 S3 兼容的对象存储。
除此之外,我们还可以根据 Kubernetes 集群容量自定义其他多个配置,例如 executor
的 CPU 和内存使用情况。我们还可以根据 Dremio 将要处理的工作负载的大小指定所需的执行器数量。
使用 Helm 安装 Dremio
确保在 values.minio.yaml
中更新您的 Minio 端点、访问密钥和密钥。以下命令将在新创建的命名空间 dremio
中安装名为 dremio
的 Dremio 版本。
给 Helm 几分钟时间来发挥其魔力,然后验证 Dremio 是否已安装并正在运行。
登录 Dremio
要登录 Dremio,让我们为 dremio-client
服务到本地主机建立端口转发。执行以下命令后,将浏览器指向 http://localhost:9047。出于安全考虑,请记住在完成 Dremio 的探索后关闭端口转发。
首次启动 Dremio 时,您需要创建一个新用户。

创建用户后,我们会看到一个欢迎页面。为了简化此工作流程,让我们将 openlake 存储库 data/nyc_taxi_small.csv
中包含的示例数据集上传到 Dremio 并开始查询它。
我们可以通过单击主页右上角的 + 来上传 openlake/dremio/data/nyc_taxi_small.csv
,如下所示

Dremio 将自动解析 CSV 并提供推荐的格式,如下所示,单击“保存”继续。

要验证 CSV 文件是否已上传到 MinIO 存储桶
加载文件后,我们将进入 SQL 查询控制台,可以在其中开始执行查询。以下是可以尝试执行的 2 个示例查询
SELECT count(*) FROM nyc_taxi_small;
SELECT * FROM nyc_taxi_small;
将以上内容粘贴到控制台并单击“运行”,然后您会看到如下内容

您可以单击“Query1”选项卡以查看数据集中行的数量

您可以单击“Query2”选项卡以查看数据集中行的数量

数据湖和 Dremio
这篇博文引导您在 Kubernetes 集群中部署 Dremio 并使用 MinIO 作为分布式存储。我们还了解了如何将示例数据集上传到 Dremio 并开始查询它。在这篇文章中,我们只是触及了冰山一角😜,以帮助您开始构建数据湖。
说到冰山,Apache Iceberg 是一种为对象存储构建的开放式表格式。许多数据湖都是使用 Dremio、Spark、Iceberg 和 MinIO 的组合构建的。要了解更多信息,请参阅 使用 Iceberg 和 MinIO 的湖仓架构权威指南。
立即在 MinIO 上尝试 Dremio。如果您有任何疑问或想分享技巧,请通过我们的 Slack 频道 联系我们或向 hello@min.io 发送邮件。