2017-07-27 10 views
2

TextIO.read()AvroIO.read()(他のBeam IOと同様)は、デフォルトでは、現在のApache Beamランナーで非常に多くのファイル(たとえば1Mファイル)に展開されるファイルパターンを読むときにはあまりうまく機能しません。非常に多数のファイルを読み込むときに、TextIOまたはAvroIOのパフォーマンスを向上させるにはどうすればよいですか?

このように多数のファイルを効率的に読み取るにはどうすればよいですか?あなたはfilepatternがTextIOまたはAvroIOが多数のファイルに展開しようとしていると読まれることが事前にわかっている場合

答えて

0

は、あなたが現在TextIOAvroIOに実装されてrecently added機能.withHintMatchesManyFiles()を、使用することができます。例えば

:このヒントを使用して

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

は変換が多数のファイルを読み取るための最適化された方法で実行させる:このケースで読み取ることができるファイルの数は事実上無制限であり、パイプラインはこのヒントなしでより速く、安く、信頼性高く実行されるでしょう。

しかし、filepatternが実際に少数のファイル(たとえば、数十または数百のファイル)と一致する場合は、ヒントがないとパフォーマンスが低下することがあります。同じ注意点とfilepatternsのPCollection<String>を読み取る可能read()のより柔軟でスケーラブルなバージョン(それぞれStringがfilepatternである)であるボンネットの下で、このヒントは、変換は、それぞれTextIO.readAll()又はAvroIO.readAll()を介して実行させる

、 :ファイルパターンと一致するファイルの総数が少ない場合、単純にread()よりも悪く実行され、パイプライン構築時にfilepatternが指定されます。

関連する問題