【发布时间】:2017-07-27 22:36:22
【问题描述】:
TextIO.read() 和 AvroIO.read()(以及其他一些 Beam IO)默认情况下在当前的 Apache Beam 运行器中在读取扩展为大量文件的文件模式时表现不佳 - 例如,1M文件。
如何高效读取如此大量的文件?
【问题讨论】:
标签: google-cloud-dataflow apache-beam apache-beam-io
TextIO.read() 和 AvroIO.read()(以及其他一些 Beam IO)默认情况下在当前的 Apache Beam 运行器中在读取扩展为大量文件的文件模式时表现不佳 - 例如,1M文件。
如何高效读取如此大量的文件?
【问题讨论】:
标签: google-cloud-dataflow apache-beam apache-beam-io
当你提前知道使用TextIO或AvroIO读取的文件模式将扩展成大量文件时,你可以使用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<String>(其中每个 String是一个文件模式),同样需要注意的是:如果与文件模式匹配的文件总数很少,它们的性能可能会比在管道构建时指定文件模式的简单read() 更差。
【讨论】:
withHintMatchesManyFiles 没有解决它。 readFromGCS这一步还是卡住了……