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

现代数据环境需要一种新型的基础设施——一种能够无缝集成结构化和非结构化数据、轻松扩展并支持高效 AI/ML 工作负载的基础设施。这就是现代数据湖发挥作用的地方,它为您的所有数据需求提供了一个中央枢纽。但是,构建和管理一个有效的数据湖可能很复杂。
这篇博文深入探讨了三种可以优化您当前方法的强大工具:Apache Iceberg、Tabular 和 MinIO。以下步骤将引导您了解这些服务如何无缝结合,以创建专门针对 AI/ML 工作负载优化的强大、云原生数据湖架构。
什么是 Tabular?
Tabular 是由 Apache Iceberg 的最初创建者创建的数据平台。它旨在提供一个独立的、通用的存储平台,该平台可以连接到任何计算层,从而消除数据供应商锁定。此功能对于现代数据栈至关重要,它允许用户选择最佳的计算和存储工具,而无需被迫使用特定供应商陈旧或不匹配的工具集。
在架构中,MinIO 和 Iceberg 可以通过 Tabular 增强。Tabular 可用于管理和查询存储在 MinIO 中的 Iceberg 数据,从而以可扩展、高性能和云原生方式存储和管理结构化数据。这些 Kubernetes 原生组件协同工作,摩擦力非常小,并建立在彼此的功能之上以进行大规模执行。
为什么选择 S3FileIO 而不是 Hadoop 的文件 IO?
此实现利用了 Iceberg 的 S3FileIO。S3FileIO 被认为优于 Hadoop 的文件 IO,原因有很多。其中一些我们已经在其他地方讨论过。
- 针对云存储进行了优化:Iceberg 的 S3FileIO 旨在与云原生存储配合使用。
- 提高吞吐量并最大程度减少节流:Iceberg 使用ObjectStoreLocationProvider将文件分布到 MinIO 存储桶中的多个前缀,这有助于最大程度减少节流并最大化与 S3 相关的 IO 操作的吞吐量。
- 严格一致性:Iceberg 已更新以充分利用严格一致性,方法是消除可能影响性能的冗余一致性检查。
- 渐进式分段上传:Iceberg 的 S3FileIO 实现了一种渐进式分段上传算法,该算法一旦每个部分准备就绪就会并行上传数据文件部分,从而减少本地磁盘使用量并提高上传速度。
- 校验和验证:Iceberg 允许对 S3 API 写入进行校验和验证,以确保上传对象的完整性,可以通过设置相应的目录属性来启用此功能。
- 自定义标签:Iceberg 支持使用 S3 API 在写入和删除操作期间向对象添加自定义标签,这对于成本跟踪和管理很有用。
- 避免负缓存: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频道与我们联系。