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。