使用 Iceberg、Tabular 和 MinIO 构建现代数据架构

Building Modern Data Architectures with Iceberg, Tabular and MinIO

现代数据环境需要一种新型的基础设施——一种能够无缝集成结构化和非结构化数据、轻松扩展并支持高效 AI/ML 工作负载的基础设施。这就是现代数据湖发挥作用的地方,它为您的所有数据需求提供了一个中央枢纽。但是,构建和管理一个有效的数据湖可能很复杂。

这篇博文深入探讨了三种可以优化您当前方法的强大工具:Apache IcebergTabular 和 MinIO。以下步骤将引导您了解这些服务如何无缝结合,以创建专门针对 AI/ML 工作负载优化的强大、云原生数据湖架构。

什么是 Tabular?

Tabular 是由 Apache Iceberg 的最初创建者创建的数据平台。它旨在提供一个独立的、通用的存储平台,该平台可以连接到任何计算层,从而消除数据供应商锁定。此功能对于现代数据栈至关重要,它允许用户选择最佳的计算和存储工具,而无需被迫使用特定供应商陈旧或不匹配的工具集。

架构中,MinIO 和 Iceberg 可以通过 Tabular 增强。Tabular 可用于管理和查询存储在 MinIO 中的 Iceberg 数据,从而以可扩展、高性能和云原生方式存储和管理结构化数据。这些 Kubernetes 原生组件协同工作,摩擦力非常小,并建立在彼此的功能之上以进行大规模执行。

为什么选择 S3FileIO 而不是 Hadoop 的文件 IO?

此实现利用了 Iceberg 的 S3FileIO。S3FileIO 被认为优于 Hadoop 的文件 IO,原因有很多。其中一些我们已经在其他地方讨论过。

  1. 针对云存储进行了优化:Iceberg 的 S3FileIO 旨在与云原生存储配合使用。
  2. 提高吞吐量并最大程度减少节流:Iceberg 使用ObjectStoreLocationProvider将文件分布到 MinIO 存储桶中的多个前缀,这有助于最大程度减少节流并最大化与 S3 相关的 IO 操作的吞吐量。
  3. 严格一致性:Iceberg 已更新以充分利用严格一致性,方法是消除可能影响性能的冗余一致性检查。
  4. 渐进式分段上传:Iceberg 的 S3FileIO 实现了一种渐进式分段上传算法,该算法一旦每个部分准备就绪就会并行上传数据文件部分,从而减少本地磁盘使用量并提高上传速度。
  5. 校验和验证:Iceberg 允许对 S3 API 写入进行校验和验证,以确保上传对象的完整性,可以通过设置相应的目录属性来启用此功能。
  6. 自定义标签:Iceberg 支持使用 S3 API 在写入和删除操作期间向对象添加自定义标签,这对于成本跟踪和管理很有用。
  7. 避免负缓存:Iceberg 中的 FileIO 接口不需要像 Hadoop 兼容的 FileSystem 那样严格的保证,这使其能够避免负缓存,否则可能会降低性能。

相比之下,之前使用 S3FileIO 的 Hadoop 的 S3A FileSystem 并未为云存储提供相同级别的优化。总而言之:不要用过去的束缚来阻碍您面向未来的数据湖基础设施。

先决条件

在开始之前,请确保您的系统满足以下要求

如果您是从头开始,则可以使用适用于您特定平台的Docker Desktop安装程序安装这两者。这通常比分别下载 Docker 和 Docker Compose 更容易。通过运行以下命令验证 Docker 是否已安装

docker-compose --version

入门

要开始使用,请克隆或复制 Tabular 的git 存储库中的 YAML 文件。您只需要此教程的 YAML。您可以稍后探索存储库的其余部分。

分解

提供的 YAML 文件是一个 Docker Compose 配置文件。它定义了一组服务及其多容器 Docker 应用程序的配置。在本例中,有两个服务:Spark-Iceberg 和 MinIO。让我们分解每个部分

1. Spark-Iceberg 服务

spark-iceberg:
    image: tabulario/spark-iceberg
    container_name: spark-iceberg
    build: spark/
    networks:
      iceberg_net:
    depends_on:
      - rest
      - minio
    volumes:
      - ./warehouse:/home/iceberg/warehouse
      - ./notebooks:/home/iceberg/notebooks/notebooks
    environment:
      - AWS_ACCESS_KEY_ID=admin
      - AWS_SECRET_ACCESS_KEY=password
      - AWS_REGION=us-east-1
    ports:
      - 8888:8888
      - 8080:8080
      - 10000:10000
      - 10001:10001
  rest:
    image: tabulario/iceberg-rest
    container_name: iceberg-rest
    networks:
      iceberg_net:
    ports:
      - 8181:8181
    environment:
      - AWS_ACCESS_KEY_ID=admin
      - AWS_SECRET_ACCESS_KEY=password
      - AWS_REGION=us-east-1
      - CATALOG_WAREHOUSE=s3://warehouse/
      - CATALOG_IO__IMPL=org.apache.iceberg.aws.s3.S3FileIO
      - CATALOG_S3_ENDPOINT=http://minio:9000

image: 指定要用于 spark-iceberg 服务的 Docker 镜像。在本例中,它使用 tabulario/spark-iceberg:latest 镜像。

depends_on: 指定 spark-iceberg 服务依赖于其余服务和 minio 服务。

container_name: 为容器分配一个特定的名称(spark-iceberg)。

environment: 设置容器的环境变量,包括 Spark 和 AWS 凭据。

volumes: 将本地目录(./warehouse 和 ./notebooks)作为卷挂载到容器内部。

ports: 将容器端口映射到主机端口,以访问 Spark UI 和其他服务。

2. Minio 服务

minio:
    image: minio/minio
    container_name: minio
    environment:
      - MINIO_ROOT_USER=admin
      - MINIO_ROOT_PASSWORD=password
      - MINIO_DOMAIN=minio
    networks:
      iceberg_net:
        aliases:
          - warehouse.minio
    ports:
      - 9001:9001
      - 9000:9000
    command: ["server", "/data", "--console-address", ":9001"]

image: 指定 MinIO 服务的 Docker 镜像。

container_name: 为容器分配一个特定的名称(MinIO)。

environment: 设置用于配置 MinIO 的环境变量,包括根用户凭据。

ports: 将容器端口映射到主机端口,以访问 MinIO UI。

command: 指定使用特定参数启动 MinIO 服务器的命令。

MinIO 服务的另一个方面是mc,即 MinIO 的命令行工具。

  mc:
    depends_on:
      - minio
    image: minio/mc
    container_name: mc
    networks:
      iceberg_net:
    environment:
      - AWS_ACCESS_KEY_ID=admin
      - AWS_SECRET_ACCESS_KEY=password
      - AWS_REGION=us-east-1
    entrypoint: >
      /bin/sh -c "
      until (/usr/bin/mc config host add minio http://minio:9000 admin password) do echo '...waiting...' && sleep 1; done;
      /usr/bin/mc rm -r --force minio/warehouse;
      /usr/bin/mc mb minio/warehouse;
      /usr/bin/mc policy set public minio/warehouse;
      tail -f /dev/null
      "

depends_on: 指定 mc 服务依赖于 MinIO 服务。

image: 指定 mc 服务的 Docker 镜像。

container_name: 为容器分配一个特定的名称(mc)。

environment: 设置用于配置 MinIO 客户端的环境变量。

entrypoint: 定义容器的入口点命令,包括 MinIO 客户端的设置步骤。

      /usr/bin/mc rm -r --force minio/warehouse;
      /usr/bin/mc mb minio/warehouse;
      /usr/bin/mc policy set public minio/warehouse;
      tail -f /dev/null
      "

此命令序列基本上执行以下任务

  • 从 MinIO 服务器中删除现有的 warehouse 目录及其内容。
  • 创建一个名为 warehouse 的新存储桶。
  • 将 warehouse 存储桶的访问策略设置为公开。

此 Docker Compose 文件编排了一个多容器环境,其中包含 Spark、PostgreSQL、MinIO 的服务。它设置了运行这些服务所需的依赖项、环境变量和命令。这些服务协同工作以创建用于使用 Spark 和 Iceberg 处理数据的开发环境,并以 MinIO 作为对象存储后端。

启动

在终端窗口中,cd 到存储库中的 tabular-spark-setup 目录,然后运行以下命令

docker-compose up

使用凭据admin:password登录到http://127.0.0.1:9001处的 MinIO,以查看 warehouse 存储桶是否已创建。

所有容器启动并运行后,您可以通过导航到http://localhost:8888访问您的 Jupyter Notebook 服务器。

运行其中一个示例笔记本,然后返回到http://127.0.0.1:9001处的 MinIO,以查看您的 warehouse 中是否填充了数据。

构建您的现代数据湖

本教程介绍了如何使用 Iceberg、Tabular 和 MinIO 构建现代数据湖,这仅仅是一个开始。这三者强大的组合为无限可能打开了大门。借助这些工具,您可以无缝集成和分析所有数据(结构化和非结构化),以发现隐藏的模式并推动数据驱动的决策,从而推动创新。在生产环境中利用此架构的效率和灵活性,以加快您的 AI/ML 计划并释放机器学习模型的真正潜力,从而加快您实现突破性发现的步伐。如果您在构建过程中有任何疑问,请通过hello@min.io或我们的Slack频道与我们联系。