使用 Apache Arrow 和 MinIO 构建高性能数据基础设施

Building Performant Data Infrastructure with Apache Arrow and MinIO

如今,Apache Arrow 发展势头强劲。它深受开发者和数据从业者的喜爱,在业务关键型应用中的使用量大幅增长,并且像 Dremio、InfluxData、Snowflake、Streamlit 和 Tellius 这样的数据驱动型组织都对其进行了大量投入。这种采用的驱动力在于其卓越的互操作性、更简单的數據架构、更高的速度和效率、更多工具选择以及基于 Apache 许可的免受供应商锁定。

尽管发展势头强劲,但 Arrow 仍然存在一些误解。虽然 Voltron Data 团队现在拥有相当可观的资金来改变这种认知并提升知名度,但在这方面仍有一些工作要做。我们的朋友 Ravishankar Nair 几年前写过一篇相关的文章,但我们希望在这篇文章中补充一些背景信息并简化说明。

Apache Arrow 通过创建任何计算机语言都能理解的标准列式内存格式来提高数据分析速度。Apache Arrow 的性能允许在不产生序列化成本(将数据转换为可存储格式的过程)的情况下传输数据。Apache Arrow 是一种标准,可以由任何处理内存数据的计算机程序实现。

Arrow 已超越其最初专注于在内存中存储列式数据的范围。它拥有多个子项目,包括两个查询引擎。同样,Voltron Data 团队的商业影响力将有助于优先考虑企业特性,从而增强整个项目。


集成 MinIO 和 Arrow

让我们将注意力转向与 MinIO 结合运行 Arrow。

在一个包含 MinIO 和 Arrow 的架构中,MinIO 将充当数据存储,而 Spark 或 Hadoop 则充当数据处理器。Apache Arrow 将用于中间环节,用于将大量数据从 MinIO 转换/加载到 Spark/Hadoop 中。Apache Arrow 可以使用 S3 协议与 MinIO 通信。


用例示例:将文件从 CSV 转换为 Parquet - 一种针对快速查询高度优化的列式数据格式

以下是该用例的流程


- Arrow 使用 S3 协议从 MinIO 加载 CSV 文件
- Arrow 在内存中将文件转换为 Parquet 格式
- Arrow 将格式化为 Parquet 的数据存储回 MinIO


然后,Spark/Presto 可以直接从 MinIO 获取 Parquet 数据以进行进一步处理。以下是如何自己运行此设置

使用 Docker 运行 MinIO


使用 Docker 开始使用 MinIO 的最快方法是使用以下命令运行



$ mkdir -p ~/minio/data

$ docker run                              \
    -p 9000                               \
    -p 9001                               \
    -v ~/minio/data:/data                 \
    -e MINIO_ROOT_USER=exampleuser        \
    -e MINIO_ROOT_PASSWORD=somepassword   \
    --name minio1                         \
    quay.io/minio/minio                   \
    server /data --console-address :9001


此命令设置 MinIO 运行在独立模式(即 MinIO 的单节点部署)。此部署包含一个集成的 Web 图形界面,称为控制台。运行此命令后,MinIO 的数据 API 将在端口 9000 上可用,控制台 UI 将在端口 9001 上可用。

创建存储桶并上传数据


让我们通过在浏览器中访问 127.0.0.1:9001 打开 MinIO 控制台。

在 MinIO 控制台中

  • 导航到左侧菜单栏中的存储桶部分。
  • 点击右侧的“[创建存储桶 +]”按钮。将新存储桶命名为“testbucket”。
  • 创建成功后,将以下文件上传到该存储桶 - [username.csv].

安装 PyArrow

运行以下命令安装 pyarrow

$ pip install pyarrow

使用 pyarrow 从 MinIO 读取数据

  1. 导入必要的模块

#!/bin/python
from pyarrow import fs, csv, parquet


  • fs: 包含 S3Filesystem 工具类
  • csv: 用于解析 CSV 文件
  • parquet: 包含将 CSV 转换为 Parquet 格式的方法

2. 使用 S3Filesystem 将 pyarrow 连接到 MinIO



# 创建一个新的MinIO连接
minio = fs.S3FileSystem(

     endpoint_override=’127.0.0.1:9000’,
    access_key=’exampleuser’,
    secret_key=’somepassword’,
    scheme=’http’)

确保传递给S3Filesystem的参数与运行MinIO的docker命令中的命令行参数完全匹配。

3. 读取CSV文件

# 从testbucket读取上传的username.csv文件
usernameCSVFile = minio.open_input_file(testbucket/username.csv’)

# 解析CSV数据
usernameTable = csv.read_csv(usernameCSVFile)

4. 转换为Parquet格式

# 将文件转换为Parquet格式并写回MinIO
parquet.write_to_dataset(
      table=usernameTable,
      root_path=’testbucket/username.parquet’,
      filesystem=minio)

5. 验证Parquet文件是否创建成功

  • 返回MinIO控制台。
  • 在左侧菜单栏中选择“Buckets”。
  • 选择“testbucket”并点击“[浏览文件]”。
  • 确保“username.parquet”文件已创建。

就是这样。您现在可以快速读取和查询数据了。

总结

本文介绍了Apache Arrow的重要性及其与MinIO一起构建可扩展的高性能数据基础设施的作用。示例用例和设置展示了如何使用Arrow从MinIO加载数据、转换数据并将其存储回MinIO,以便Spark、Presto以及其他需要大规模性能的应用程序进行后续处理。

如果您对该设置有任何疑问,请发送邮件至 dev@min.io 与我们联系,并关注我们关于MinIO、Apache Arrow以及大数据生态系统更多文章!