- 批处理
- 流处理
- 大数据
【免费下载链接】beam
Apache Beam is a unified programming model for Batch and Streaming data processing.
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:
- 文件系统层面:Beam 将
gs://作为一种受支持的分布式文件系统接入(Java SDK 中对应GcsFileSystem,Python 中对应GcsIO,Go 中对应pkg/beam/io/filesystem/gcs)。这使得任何基于 Beam 文件系统抽象(FileSystem接口)的读写操作都可以透明地作用在 GCS 对象上。 - 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 桶写入不同文件格式的数据:
| 连接器 | 适用格式 | 典型场景 |
|---|---|---|
AvroIO | Avro 序列化记录 | 大数据批处理、跨系统数据交换 |
XMLIO | XML 文档 | 解析 XML 事件流 |
TFRecordIO | TFRecord 样本 | 机器学习训练样本读写 |
ParquetIO | Parquet 列式存储 | 分析型查询、与数据仓库互操作 |
这些连接器的使用方式与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 文件系统。
需要说明的前提与限制:
- 依赖与凭据:使用 GCS 需要安装相应的 GCP 依赖(Java 依赖
google-cloud-platform-core,Python 需安装apache-beam[gcp]或对应的 GCS 客户端库),并配置可用的 Google Cloud 凭据(如服务账号、应用默认凭据);Go 在无法取得凭据时会尝试匿名访问公开对象。 - 路径语法:所有读写路径必须符合
gs://<bucket>/<path>格式;本地路径、其他 scheme 不会路由到 GCS 文件系统。 - 分片写入语义:
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.
相关推荐
Apache Beam 与 Google Cloud Storage(GCS)文件系统集成实战指南
Apache Beam 与 Google Cloud Storage(GCS)文件系统集成实战指南 Apache Beam 提供统一的批处理和流处理编程模型,G
Apache Beam 中 Google Cloud Storage(GCS)文件系统与对象存储 I/O 实战指南
Apache Beam 中 Google Cloud Storage(GCS)文件系统与对象存储 I/O 实战指南 Apache Beam 是一套面向批处理与流
大数据批处理流处理数据工程Apache Beam TextIO 实战:从 Google Cloud Storage(GCS)读取文本文件的 Java / Python / Go 三语言指南
Apache Beam TextIO 实战:从 Google Cloud Storage(GCS)读取文本文件的 Java / Python / Go 三语言指
大数据批处理流处理数据工程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考