Google cloud dataflow 在读取大量文件时,如何提高TextIO或AvroIO的性能?

Google cloud dataflow 在读取大量文件时,如何提高TextIO或AvroIO的性能?,google-cloud-dataflow,apache-beam,apache-beam-io,Google Cloud Dataflow,Apache Beam,Apache Beam Io,默认情况下,TextIO.read()和AvroIO.read()(以及其他一些Beam IO)在当前Apache Beam Runner中读取扩展为大量文件(例如,1M文件)的文件模式时执行得不太好 如何有效地读取如此大量的文件?当您事先知道使用TextIO或AvroIO读取的文件模式将扩展为大量文件时,您可以使用功能。withHintMatchesManyFiles(),当前在TextIO和AvroIO上实现 例如: PCollection<String> lines = p.a

默认情况下,
TextIO.read()
AvroIO.read()
(以及其他一些Beam IO)在当前Apache Beam Runner中读取扩展为大量文件(例如,1M文件)的文件模式时执行得不太好


如何有效地读取如此大量的文件?

当您事先知道使用
TextIO
AvroIO
读取的文件模式将扩展为大量文件时,您可以使用功能
。withHintMatchesManyFiles()
,当前在
TextIO
AvroIO
上实现

例如:

PCollection<String> lines = p.apply(TextIO.read()
    .from("gs://some-bucket/many/files/*")
    .withHintMatchesManyFiles());
PCollection行=p.apply(TextIO.read()
.from(“gs://some bucket/many/files/*”)
.WithintMatchesManyFiles());
使用此提示会使转换以一种为读取大量文件而优化的方式执行:在这种情况下,可以读取的文件数量实际上是无限的,并且与没有此提示相比,管道运行速度更快、成本更低、更可靠

但是,如果filepattern实际上只匹配少量文件(例如,几十个或几百个文件),那么它的性能可能会比没有提示时差


在引擎盖下,此提示导致转换分别通过
TextIO.readAll()
AvroIO.readAll()
执行,这是
read()
的更灵活和可扩展版本,允许读取文件模式的
PCollection
(其中每个
字符串都是文件模式),同样需要注意的是:如果与文件模式匹配的文件总数很小,那么它们的性能可能会比管道构造时使用指定的文件模式执行简单的
read()
更差。

Python API有什么等效的吗?我什么也找不到。从GCS读取许多小文件非常慢。@jkff我可以使用正则表达式作为文件模式吗?它似乎不起作用。@Kakaji,当我试图从地面军事系统读取大量文件时,你可以使用glob-like文件模式,使用
with-hint匹配任何文件都无法解决此问题。步骤
readFromGCS
仍然卡住。。。