提问者:小点点

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


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

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


共1个答案

匿名用户

当您事先知道使用TextIOAvroIO读取的文件将扩展为大量文件时,您可以使用最近添加的功能. withHintMatchesManyFiles(),该功能目前在TextIOAvroIO上实现。

例如:

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

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

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

在底层,此提示导致转换分别通过TextIO. readAll()AvroIO.readAll()执行,这是更灵活和可扩展的read()版本,允许读取PCollection