TextIO.read()
和AvroIO.read()
(以及其他一些Beam IO)在读取扩展为大量文件的文件模式时,在当前的Apache Beam运行器中表现不佳 - 例如,1M文件。
如何有效地阅读如此大量的文件?
答案 0 :(得分:1)
如果您事先知道正在使用TextIO
或AvroIO
阅读的文件模式将扩展为大量文件,则可以使用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()
表现更差施工时间。