读取大量文件时如何提高 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 文件。

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

当您事先知道使用TextIOAvroIO读取的文件模式将扩展为大量文件时,您可以使用recently added功能.withHintMatchesManyFiles(),目前在 TextIOAvroIO.

上实施

例如:

PCollection<String> lines = p.apply(TextIO.read()
    .from("gs://some-bucket/many/files/*")
    .withHintMatchesManyFiles());

使用此提示会导致转换以针对读取大量文件优化的方式执行:在这种情况下可以读取的文件数量实际上是无限的,并且很可能管道将 运行 比没有这个提示更快、更便宜、更可靠。

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

在幕后,这个提示导致转换分别通过 TextIO.readAll()AvroIO.readAll() 执行,它们是 read() 的更灵活和可扩展的版本,允许读取 PCollection<String> 的文件模式(其中每个 String 是一个文件模式),但有相同的警告:如果与文件模式匹配的文件总数很小,它们的性能可能比指定文件模式的简单 read() 更差在管道施工时。