读取大量文件时如何提高 TextIO 或 AvroIO 的性能?
How can I improve performance of TextIO or AvroIO when reading a very large number of files?
默认情况下,TextIO.read()
和 AvroIO.read()
(以及其他一些 Beam IO)在读取扩展为大量文件 - 例如,1M 文件。
如何高效读取如此大量的文件?
当您事先知道使用TextIO
或AvroIO
读取的文件模式将扩展为大量文件时,您可以使用recently added功能.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()
更差在管道施工时。
TextIO.read()
和 AvroIO.read()
(以及其他一些 Beam IO)在读取扩展为大量文件 - 例如,1M 文件。
如何高效读取如此大量的文件?
当您事先知道使用TextIO
或AvroIO
读取的文件模式将扩展为大量文件时,您可以使用recently added功能.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()
更差在管道施工时。