【问题标题】:How can I improve performance of TextIO or AvroIO when reading a very large number of files?读取大量文件时如何提高 TextIO 或 AvroIO 的性能?
【发布时间】:2017-07-27 22:36:22
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    当你提前知道使用TextIOAvroIO读取的文件模式将扩展成大量文件时,你可以使用recently added功能.withHintMatchesManyFiles(),目前在@上实现987654325@和AvroIO

    例如:

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

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

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

    在后台,此提示导致转换分别通过 TextIO.readAll()AvroIO.readAll() 执行,它们是 read() 的更灵活和可扩展的版本,允许读取文件模式的 PCollection&lt;String&gt;(其中每个 String是一个文件模式),同样需要注意的是:如果与文件模式匹配的文件总数很少,它们的性能可能会比在管道构建时指定文件模式的简单read() 更差。

    【讨论】:

    • Python API 的任何等效项?我什么也找不到。从 GCS 读取许多小文件非常慢。
    • @jkff 我可以使用正则表达式作为文件模式吗?它似乎不起作用。
    • @Kakaji,你可以使用类似 glob 的文件模式
    • 当我尝试从 GCS 读取大量文件时,withHintMatchesManyFiles 没有解决它。 readFromGCS这一步还是卡住了……
    猜你喜欢
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多