TextIO.read()
并且AvroIO.read()
(以及其他一些 Beam IO)默认情况下在当前 Apache Beam 运行器中在读取扩展为大量文件(例如 1M 文件)的文件模式时表现不佳。
如何有效地读取如此大量的文件?
TextIO.read()
并且AvroIO.read()
(以及其他一些 Beam IO)默认情况下在当前 Apache Beam 运行器中在读取扩展为大量文件(例如 1M 文件)的文件模式时表现不佳。
如何有效地读取如此大量的文件?
当您提前知道正在读取的文件模式TextIO
或AvroIO
将扩展为大量文件时,您可以使用最近添加的功能.withHintMatchesManyFiles()
,该功能目前在TextIO
和上实现AvroIO
。
例如:
PCollection<String> lines = p.apply(TextIO.read()
.from("gs://some-bucket/many/files/*")
.withHintMatchesManyFiles());
使用此提示会导致转换以针对读取大量文件而优化的方式执行:在这种情况下可以读取的文件数量实际上是无限的,并且很可能管道将运行得更快、更便宜、更可靠。这个提示。
但是,如果文件模式实际上只匹配少量文件(例如,几十个或几百个文件),它的性能可能会比没有提示的情况更差。
在后台,此提示导致转换分别通过TextIO.readAll()
或执行AvroIO.readAll()
,这是更灵活和可扩展的版本read()
,允许读取文件模式PCollection<String>
(其中每个String
都是文件模式),但需要注意的是:如果文件总数匹配文件模式很小,它们的性能可能比read()
在管道构建时指定的文件模式简单。