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

时间:2017-07-27 22:36:22

标签: google-cloud-dataflow apache-beam apache-beam-io

默认情况下,

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

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

1 个答案:

答案 0 :(得分:1)

如果您事先知道正在使用TextIOAvroIO阅读的文件模式将扩展为大量文件,则可以使用recently added功能{{1} },目前已在.withHintMatchesManyFiles()TextIO上实施。

例如:

AvroIO

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

但是,如果filepattern实际上只匹配少量文件(例如,几十个或几百个文件),它可能比没有提示更糟糕。

根据说明,此提示会导致转换分别通过PCollection<String> lines = p.apply(TextIO.read() .from("gs://some-bucket/many/files/*") .withHintMatchesManyFiles()); TextIO.readAll()执行,这些AvroIO.readAll()read()的更灵活,可扩展的版本,允许读取PCollection<String> filepatterns(其中每个String是一个文件模式),具有相同的警告:如果与文件模式匹配的文件总数很小,它们可能比在管道中指定的文件模式的简单read()表现更差施工时间。