2016-04-22 3 views
4

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) 

を私は考えパイプのトポロジに問題があると思われますが、同じパイプラインを実行していることを確認してください。

  1. 罰金の作品(別の年のために、5ギガバイト)大きなデータセットにDataflowPipelineRunner とクラウドに細かい
  2. を作品DirectPipelineRunnerとローカル

私は、データフローの並列化とどのように問題があると仮定しますパイプラインで作業を配布します。それを検査したり影響を与える可能性はありますか?

+0

'BQImportAndCompute'は何をしているのですか?また、 'BQConcat'は' Flatten'のように見えますが、それは正しいのですか?何が起きているのかを見るために特定のジョブIDがありますか? –

+0

BQImportAndComputeはTableRowを読み込み、別のPOJOに変換しています。はい、BQConcatはFlattenです。 たとえば、jobIDは2016-04-22_07_09_50-6916524826145032691です。実際には、手動で取り消されたジョブはすべて完了しませんでした。 https://www.evernote.com/l/ADtUXFwm92ROr5sTXqEUVrcfhUwQfrHctFM –

+0

また、私はOutOfMemoryを投げた後、JVMが終了しなかったことを後で知りました。私はworkerに接続し、JVMプロセスを強制終了しようとしました。その後、次のOOMまで、より多くのデータが処理されました。繰り返し回数が少なすぎると、再試行が多すぎるためにパイプが失敗しました。 –

答えて

1

ここでの問題は、BigQueryのテーブルの大きさが、おそらく使用されてBigQueryの源の数やパイプラインの残りの部分に関連していないようです。

  1. 複数のBigQueryソースから読み込み、それらを平坦化する代わりに、すべての情報を取得するクエリから読み込みを試みましたか?これを1ステップで実行すると、パイプラインが簡素化され、BigQueryのパフォーマンスが向上します(複数のテーブルに対して1つのクエリを実行したり、個々のテーブルに対して複数のクエリを実行する)。

  2. もう1つの問題は、BQImportAndCompute操作の中または後でファンアウトの程度が高い場合です。そこで実行されている計算に応じて、賢明なCombineFnまたはWindowFnを使用してファンアウトを減らすことができます。その道を改善する方法を知りたい場合は、BQImportAndComputeの後に起こっていることの詳細を共有してください。

+0

私はパイプラインのソースコードをgithub [ダッシュパイプライン](https://github.com/ceresnam/dash-pipeline)に入れました。ファンアウトの度合いを減らそうとしています。 –

関連する問題