news 2026/10/17 22:55:27

Apache Beam 使用指南:基于 Google Cloud Storage 文件系统(gs://)读写数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Apache Beam 使用指南:基于 Google Cloud Storage 文件系统(gs://)读写数据
  • 批处理
  • 流处理
  • 大数据

【免费下载链接】beam

Apache Beam is a unified programming model for Batch and Streaming data processing.

项目地址:https://gitcode.com/gh_mirrors/beam15/beam
点击查看免费下载

Apache Beam 提供了对 Google Cloud Storage(GCS)对象存储的完整支持:既能通过内置 I/O 连接器从 GCS 桶中读取数据、写入数据,也能让管道直接与 GCS 文件系统交互(如检查文件是否存在、列出目录文件、删除文件)。本文基于当前仓库中learning/prompts/documentation-lookup-nolinks/23_io_gcs.md的说明展开,并结合 Java、Python、Go 三个 SDK 的源码实现进行纵深解析,读完你将对gs://路径、通配符匹配、文件系统 API 以及底层实现原理有完整的实战认知。

Google Cloud Storage 与 Apache Beam 的集成概览

Google Cloud Storage 是 Google Cloud 提供的对象存储服务,用于在云端存储和访问数据。Apache Beam 从两个层面支持 GCS:

  1. 文件系统层面:Beam 将gs://作为一种受支持的分布式文件系统接入(Java SDK 中对应GcsFileSystem,Python 中对应GcsIO,Go 中对应pkg/beam/io/filesystem/gcs)。这使得任何基于 Beam 文件系统抽象(FileSystem接口)的读写操作都可以透明地作用在 GCS 对象上。
  2. I/O 连接器层面:Beam 内置的TextIO连接器原生支持读写 GCS 桶;AvroIO、XMLIO、TFRecordIO、ParquetIO等格式连接器同样支持在 GCS 桶内读写各自的文件格式。

因此,无论是文本日志、Avro 记录、TFRecord 样本还是 Parquet 列存数据,只要指定gs://路径,Beam 管道即可直接读写,无需额外编写定制连接器。

gs:// 路径格式与命名规范

GCS 对象的访问路径统一使用以下格式:

gs://<bucket>/<path>

其中<bucket>是 GCS 存储桶名称,<path>是桶内对象(对象名,可视为"虚拟目录+文件名")。例如:

gs://my-bucket/my-file.txt

在 Apache Beam 中,所有接受文件路径的参数(如TextIO.read().from(...)、TextIO.write().to(...))都可以直接传入gs://路径。以 Java 源码实现为例,GcsFileSystem.java 通过getScheme()返回"gs"来声明自己负责gs://前缀的 URI;路径在内部被解析为GcsPath(GcsPath.fromUri),进而映射到GcsResourceId参与后续的文件系统操作。该文件系统通过 GcsFileSystemRegistrar.java 以@AutoService(FileSystemRegistrar.class)方式注册,Beam 在解析gs://路径时会自动加载它。

提示:GCS 中并不存在真正的"目录",gs://my-bucket/dir/这种带尾部斜杠的路径在 Java 的GcsFileSystem中被视为目录型资源标识,源码中matchNewResource会在目录路径后自动补/,而文件路径以/结尾则会被拒绝(见 GcsFileSystem.java)。

用内置 I/O 连接器读写 GCS

TextIO:文本数据读写

Beam 内置的TextIO连接器是读写 GCS 文本文件的最直接方式,其实现位于 TextIO.java。Java 示例:

// 从 GCS 读取文本 PCollection<String> lines = p.apply( "ReadFromGcs", TextIO.read().from("gs://my-bucket/my-file.txt")); // 写入 GCS(生成 gs://my-bucket/output-00000-of-00001 等分片文件) p.apply("WriteToGcs", TextIO.write().to("gs://my-bucket/output"));

Python 示例:

import apache_beam as beam with beam.Pipeline() as p: # 读取 lines = p | 'ReadFromGcs' >> beam.io.ReadFromText('gs://my-bucket/my-file.txt') # 写入 lines | 'WriteToGcs' >> beam.io.WriteToText('gs://my-bucket/output')

Go 示例:

import ( "github.com/apache/beam/sdks/v2/go/pkg/beam" "github.com/apache/beam/sdks/v2/go/pkg/beam/io/textio" ) func main() { beam.Init() p := beam.NewPipeline() s := p.Root() lines := textio.Read(s, "gs://my-bucket/my-file.txt") textio.Write(s, "gs://my-bucket/output", lines) }

读取与写入的具体字节流操作最终落到各 SDK 的文件系统实现上:Java 端由GcsFileSystem.open(...)/create(...)调用GcsUtil完成通道创建(GcsFileSystem.java);Go 端由gcs包实现OpenRead/OpenWrite(见 gcs.go);Python 端由GcsIO.open(...)提供流式读写(见 gcsio.py)。

其他格式连接器:AvroIO、XMLIO、TFRecordIO、ParquetIO

除了TextIO,Beam 的AvroIO、XMLIO、TFRecordIO、ParquetIO连接器同样支持从 GCS 桶读取数据、向 GCS 桶写入不同文件格式的数据:

连接器适用格式典型场景
AvroIOAvro 序列化记录大数据批处理、跨系统数据交换
XMLIOXML 文档解析 XML 事件流
TFRecordIOTFRecord 样本机器学习训练样本读写
ParquetIOParquet 列式存储分析型查询、与数据仓库互操作

这些连接器的使用方式与TextIO一致,只需将文件路径替换为gs://形式,例如:

// 读取 GCS 中的 Parquet 文件 PCollection<GenericRecord> records = p.apply( "ReadParquet", ParquetIO.read(ParquetIO.ReadFiles.class) .from("gs://my-bucket/records/*.parquet"));

由于它们均构建在 Beam 统一的文件系统抽象之上,只要路径以gs://开头,就会被自动路由到 GCS 文件系统实现,因此在 GCS 桶内读写不同文件格式与在本地/其他文件系统上的代码完全一致,仅路径前缀不同。

通配符(Wildcard)读写多个文件

Beam 的读写变换支持在gs://路径中使用通配符,从而一次处理多个文件(读)或一次写入多个分片(写)。

例如,gs://my-bucket/my-files-*.txt可以匹配该桶内所有文件名符合该模式的对象,用于读取或写入:

  • 读取:TextIO.read().from("gs://my-bucket/my-files-*.txt")会展开匹配到的全部文件并合并为一条PCollection;
  • 写入:TextIO.write().to("gs://my-bucket/my-files-*.txt")时,*会被替换为实际生成的分片编号(如my-files-00000-of-00002.txt)。

在 Java 的GcsFileSystem中,通配符展开由match(List<String> specs)负责:路径先按GcsUtil.isWildcard(path)区分为 glob 与非 glob 两类(GcsUtil.java),glob 路径通过expand(gcsPattern)处理:先由GcsUtil.getNonWildcardPrefix提取通配符前的静态前缀(GcsUtil.java),调用 GCS List API 分页列出该前缀下的对象,再用正则wildcardToRegexp(...)对每个对象名做精确过滤,最终返回匹配集合(GcsFileSystem.java)。

Go SDK 采用类似策略:gcs包的List(ctx, glob)先用前缀列出候选对象,再在内存中做 glob 匹配(见 gcs.go)。值得注意的是,Beam 文件系统对通配符的支持以"尽可能将*之前的字符作为前缀以缩小 List 范围"为优化原则,因此在设计对象命名时,将可枚举的静态部分放在通配符之前(如gs://bucket/date=2024-*/data-*.avro)可以获得更好的性能。

直接操作 GCS 文件系统

除了通过 I/O 连接器读写数据,Apache Beam 还允许管道直接与 GCS 文件系统交互,例如:

  • 验证某个文件是否存在;
  • 获取目录下的文件列表;
  • 删除文件。

Java 中可通过FileSystems工具类获得文件系统实例并执行上述操作(底层即GcsFileSystem)。从源码可以看出GcsFileSystem完整实现了 BeamFileSystem<GcsResourceId>抽象的所有核心能力:

  • 匹配/列举:match返回MatchResult(含文件大小、MD5 校验和、最后修改时间等元数据),GcsFileSystem.java;
  • 打开/创建:open/create,后者还支持设置 MIME 类型、预期文件不存在校验以及上传缓冲区大小(GcsCreateOptions),GcsFileSystem.java;
  • 复制/重命名:copy/rename,并可通过GcsOptions.getGcsPerformanceMetrics()开启复制/重命名次数与耗时的指标统计,GcsFileSystem.java;
  • 删除:delete批量删除对象,GcsFileSystem.java。

Python 的GcsIO(gcsio.py)同样提供了一组等价的能力,包括open(读/写流)、delete、copy、rename、exists(判断对象是否存在)与size(获取对象大小),可直接用于管道内的文件操作。

Go SDK 的 GCS 文件系统实现位于 gcs.go,通过init()中的filesystem.Register("gs", New)注册gs://scheme(gcs.go),并实现了List、OpenRead、OpenWrite、Size、LastModified、Remove、Copy等接口。其客户端初始化优先使用应用默认凭据(storage.ScopeReadWrite),失败时回退为匿名访问(gcs.go)。

语言支持与适用前提

GCS 文件系统在 Java、Python、Go 三个 Beam SDK 中均受支持,与本仓库中的实现一一对应:

  • Java:sdks/java/extensions/google-cloud-platform-core模块中的GcsFileSystem及其注册器;
  • Python:sdks/python/apache_beam/io/gcp/gcsio.py中的GcsIO;
  • Go:sdks/go/pkg/beam/io/filesystem/gcs/gcs.go中的 gcs 文件系统。

需要说明的前提与限制:

  1. 依赖与凭据:使用 GCS 需要安装相应的 GCP 依赖(Java 依赖google-cloud-platform-core,Python 需安装apache-beam[gcp]或对应的 GCS 客户端库),并配置可用的 Google Cloud 凭据(如服务账号、应用默认凭据);Go 在无法取得凭据时会尝试匿名访问公开对象。
  2. 路径语法:所有读写路径必须符合gs://<bucket>/<path>格式;本地路径、其他 scheme 不会路由到 GCS 文件系统。
  3. 分片写入语义:write().to("gs://...")通常生成多个分片文件,输出文件名的具体形态取决于连接器与 Runner 的实现,通配符仅用于指定输出前缀/模式。

小结

Apache Beam 对 Google Cloud Storage 的支持是"文件系统抽象 + 格式连接器"双层架构的自然结果:gs://被注册为受支持的 scheme,TextIO、AvroIO、XMLIO、TFRecordIO、ParquetIO等连接器在此基础上提供格式化的读写能力,通配符机制让多文件批处理与分片写入变得透明,而 Java、Python、Go 三端对齐的文件系统 API(匹配、列举、存在性检查、删除、复制、重命名)则保证了在管道内直接管理 GCS 对象的可操作性。设计数据管道时,只需遵循gs://<bucket>/<path>路径规范并把静态前缀放在通配符之前,即可高效、可靠地在云端对象存储上运行 Beam 作业。

  • 批处理
  • 流处理
  • 大数据

【免费下载链接】beam

Apache Beam is a unified programming model for Batch and Streaming data processing.

项目地址:https://gitcode.com/gh_mirrors/beam15/beam
点击查看免费下载
上一篇:wrk与消息队列集成:异步系统性能测试方案
下一篇:10个顶级Android UI库:提升开发效率的终极指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 3:45:56

单分子结输运第一原理计算:DFT+NEGF建模、整流与开关分析

简介&#xff1a;一份以“云计算”为分类标识、聚焦新型单分子结输运性质第一原理计算的研究型PDF文档&#xff0c;面向分子电子学、量子输运与第一性原理计算方向的科研人员及研究生。内容围绕单分子或小分子簇器件的电学与光学特性&#xff0c;系统阐述开关效应、负微分电阻、…

作者头像 李华
网站建设 2026/10/17 7:48:38

基于OpenCV与CNN的Python车牌识别系统:从定位分割到深度学习识别全流程

简介&#xff1a;这份资源是经过导师审核的Python车牌识别系统毕设项目源码&#xff0c;评审分达95分以上&#xff0c;面向计算机相关专业学生与从业者&#xff0c;可用于毕业设计、期末课程设计或大作业参考。项目融合深度学习与OpenCV技术&#xff0c;实现车牌检测与字符识别…

作者头像 李华
网站建设 2026/10/17 14:27:59

cua:用AST解析与依赖图谱,生成Markdown导读快速理解代码库

1. 为什么会有 cua&#xff1a;一个关于“看不懂别人的代码”的故事先交代一下背景。前阵子接手了一个合作方移交过来的后端项目&#xff0c;仓库存量大概有十几万行代码&#xff0c;微服务和公共库混在一起&#xff0c;模块之间互相引用得像一盘意大利面。交接文档不是没有&am…

作者头像 李华