5

TextIO.read()并且AvroIO.read()(以及其他一些 Beam IO)默认情况下在当前 Apache Beam 运行器中在读取扩展为大量文件(例如 1M 文件)的文件模式时表现不佳。

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

4

1 回答 1

4

当您提前知道正在读取的文件模式TextIOAvroIO将扩展为大量文件时,您可以使用最近添加的功能.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()在管道构建时指定的文件模式简单。

于 2017-07-27T22:36:22.047 回答