TextIO.read()
和AvroIO.read()
(以及一些其他Beam IO)在读取扩展到大量文件(例如1M文件)的文件模式时,在当前的Apache Beam跑步者中表现不佳。如何在读取大量文件时提高TextIO或AvroIO的性能?
如何有效地读取如此大量的文件?
TextIO.read()
和AvroIO.read()
(以及一些其他Beam IO)在读取扩展到大量文件(例如1M文件)的文件模式时,在当前的Apache Beam跑步者中表现不佳。如何在读取大量文件时提高TextIO或AvroIO的性能?
如何有效地读取如此大量的文件?
当你事先知道filepattern被读取TextIO
或AvroIO
将会扩展到大量的文件,你可以使用recently added功能.withHintMatchesManyFiles()
,这是目前在TextIO
和AvroIO
实施。
例如:
PCollection<String> lines = p.apply(TextIO.read()
.from("gs://some-bucket/many/files/*")
.withHintMatchesManyFiles());
使用该提示会导致用于读取大量文件的最优化的方式来执行变换:可在这种情况下可以读出的文件的数量几乎是无限的,并且最有可能的是,管道运行速度会更快,更便宜,而且比没有这个提示更可靠。
但是,如果文件模式实际上只匹配少量文件(例如,几十或几百个文件),它可能会比没有提示更差。
引擎盖下,此提示使变换分别经由TextIO.readAll()
或AvroIO.readAll()
来执行,它们是read()
更灵活和可扩展的版本,其允许读取filepatterns(其中每个String
是filepattern)的PCollection<String>
,具有相同的警告:如果与文件模式匹配的文件总数很少,那么它们可能比简单的read()
更糟糕,它在管道构建时指定了filepattern。