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

Dremio and MinIO on Kubernetes for Fast Scalable Analytics

像 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 集群。您可以使用 MinikubeKind 设置本地 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 将将其用作分布式存储

!mc mb play/openlake
!mc mb play/openlake/dremio

克隆 dremio-cloud-tools 仓库

我们将使用 Dremio 仓库中的 helm 图表来设置它

!git clone https://github.com/dremio/dremio-cloud-tools

我们将使用图表的 dremio_v2 版本,并将使用 openlake 存储库的 Dremio 目录中的 values.minio.yaml 文件来设置 Dremio。让我们将 YAML 复制到 dremio-cloud-tools/charts/dremio_v2,然后确认它已复制

!cp ~/openlake/dremio/charts/values.minio.yaml ~/dremio-cloud-tools/charts/dremio_v2/
!ls ~/dremio-cloud-tools/charts/dremio_v2/

部署细节

如果我们深入研究 values.minio.yaml 文件(您可以随意使用 cat 或在您选择的编辑器中打开文件),我们将对我们的部署有更深入的了解,并了解对 distStorage 部分进行的一些修改

distStorage:
  aws:
    bucketName: "openlake"
    path: "/dremio"
    authentication: "accessKeySecret"
    credentials:
    accessKey: "minioadmin"
    secret: "minioadmin"

    extraProperties: |
    <property>
      <name>fs.s3a.endpoint</name>
      <value>play.min.io</value>
    </property>
    <property>
      <name>fs.s3a.path.style.access</name>
      <value>true</value>
    </property>
    <property>
      <name>dremio.s3.compat</name>
      <value>true</value>
    </property>

我们将 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 版本。

!cd ~/dremio-cloud-tools/charts

!helm install dremio dremio_v2 -f dremio_v2/values.minio.yaml --命名空间 dremio --创建-命名空间

给 Helm 几分钟时间来发挥其魔力,然后验证 Dremio 是否已安装并正在运行。

!kubectl -n dremio get pods # Helm 安装完成后 是否 完成,这需要一些时间 才能 使 Pod 处于 启动 运行
!kubectl -n dremio get svc # 列出 所有 dremio 命名空间中的服务
!mc ls play/openlake/dremio # 应该可以看到 新的 前缀正在创建,Dremio 将在稍后使用

登录 Dremio

要登录 Dremio,让我们为 dremio-client 服务到本地主机建立端口转发。执行以下命令后,将浏览器指向 http://localhost:9047。出于安全考虑,请记住在完成 Dremio 的探索后关闭端口转发。

!kubectl -n dremio port-forward svc/dremio-client 9047 

首次启动 Dremio 时,您需要创建一个新用户。

创建用户后,我们会看到一个欢迎页面。为了简化此工作流程,让我们将 openlake 存储库 data/nyc_taxi_small.csv 中包含的示例数据集上传到 Dremio 并开始查询它。

我们可以通过单击主页右上角的 + 来上传 openlake/dremio/data/nyc_taxi_small.csv,如下所示

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

要验证 CSV 文件是否已上传到 MinIO 存储桶

!mc ls --summarize --recursive openlake/dremio/uploads # 您将看到已上传到 MinIO 存储桶的 CSV 文件

加载文件后,我们将进入 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 发送邮件。