BigQueryのデータを読み込み、さまざまな暦年の履歴データを処理しています(pipeline)。それ入力データは小さな(〜500メガバイト)である場合のOutOfMemoryErrorエラーで失敗Dataflow OutOfMemoryError BigQueryから小さなテーブルを読み取っているとき
起動時には、それは短い時間の後、それがダウンして何百もの要素/ sに減速し、BigQueryのおよそ10.000要素/秒から読み込み、それは完全にハングアップします。
次の処理ステップ(BQImportAndCompute)で「追加された要素」を観察すると、値が増加してから再び減少します。それはすでに読み込まれたデータがドロップされてから再び読み込まれるようなものです。
のStackdriverロギングコンソールは、たとえば、java.lang.OutOfMemoryErrorをが含まれている様々なスタックトレースでエラーが含まれています。データフローサービスへの作業項目の進行状況の更新を報告
エラー:
"java.lang.OutOfMemoryError: Java heap space
at com.google.cloud.dataflow.sdk.runners.worker.BigQueryAvroReader$BigQueryAvroFileIterator.getProgress(BigQueryAvroReader.java:145)
at com.google.cloud.dataflow.sdk.util.common.worker.ReadOperation$SynchronizedReaderIterator.setProgressFromIteratorConcurrent(ReadOperation.java:397)
at com.google.cloud.dataflow.sdk.util.common.worker.ReadOperation$SynchronizedReaderIterator.setProgressFromIterator(ReadOperation.java:389)
at com.google.cloud.dataflow.sdk.util.common.worker.ReadOperation$1.run(ReadOperation.java:206)
を私は考えパイプのトポロジに問題があると思われますが、同じパイプラインを実行していることを確認してください。
- 罰金の作品(別の年のために、5ギガバイト)大きなデータセットにDataflowPipelineRunner とクラウドに細かい
- を作品DirectPipelineRunnerとローカル
私は、データフローの並列化とどのように問題があると仮定しますパイプラインで作業を配布します。それを検査したり影響を与える可能性はありますか?
'BQImportAndCompute'は何をしているのですか?また、 'BQConcat'は' Flatten'のように見えますが、それは正しいのですか?何が起きているのかを見るために特定のジョブIDがありますか? –
BQImportAndComputeはTableRowを読み込み、別のPOJOに変換しています。はい、BQConcatはFlattenです。 たとえば、jobIDは2016-04-22_07_09_50-6916524826145032691です。実際には、手動で取り消されたジョブはすべて完了しませんでした。 https://www.evernote.com/l/ADtUXFwm92ROr5sTXqEUVrcfhUwQfrHctFM –
また、私はOutOfMemoryを投げた後、JVMが終了しなかったことを後で知りました。私はworkerに接続し、JVMプロセスを強制終了しようとしました。その後、次のOOMまで、より多くのデータが処理されました。繰り返し回数が少なすぎると、再試行が多すぎるためにパイプが失敗しました。 –