私のチームが開発したDataflowパイプラインが突然スタックし始め、イベントの処理が停止しました。彼らの労働者のログは、特定の1つのステップが停止したことを示す警告メッセージで一杯になりました。異常なのは、失敗しているステップが異なることです。1つはBigQuery出力で、もう1つはCloud Storage出力です。
以下は、受信しているログメッセージです。
BigQuery出力の場合:
Processing stuck in step <STEP_NAME>/StreamingInserts/StreamingWriteTables/StreamingWrite for at least <TIME> without outputting or completing in state finish
at Sun.misc.Unsafe.park(Native Method)
at Java.util.concurrent.locks.LockSupport.park(LockSupport.Java:175)
at Java.util.concurrent.FutureTask.awaitDone(FutureTask.Java:429)
at Java.util.concurrent.FutureTask.get(FutureTask.Java:191)
at org.Apache.beam.sdk.io.gcp.bigquery.BigQueryServicesImpl$DatasetServiceImpl.insertAll(BigQueryServicesImpl.Java:765)
at org.Apache.beam.sdk.io.gcp.bigquery.BigQueryServicesImpl$DatasetServiceImpl.insertAll(BigQueryServicesImpl.Java:829)
at org.Apache.beam.sdk.io.gcp.bigquery.StreamingWriteFn.flushRows(StreamingWriteFn.Java:131)
at org.Apache.beam.sdk.io.gcp.bigquery.StreamingWriteFn.finishBundle(StreamingWriteFn.Java:103)
at org.Apache.beam.sdk.io.gcp.bigquery.StreamingWriteFn$DoFnInvoker.invokeFinishBundle(Unknown Source)
Cloud Storage出力の場合:
Processing stuck in step <STEP_NAME>/WriteFiles/WriteShardedBundlesToTempFiles/WriteShardsIntoTempFiles for at least <TIME> without outputting or completing in state process
at Sun.misc.Unsafe.park(Native Method)
at Java.util.concurrent.locks.LockSupport.park(LockSupport.Java:175)
at Java.util.concurrent.FutureTask.awaitDone(FutureTask.Java:429)
at Java.util.concurrent.FutureTask.get(FutureTask.Java:191)
at com.google.cloud.hadoop.util.AbstractGoogleAsyncWriteChannel.waitForCompletionAndThrowIfUploadFailed(AbstractGoogleAsyncWriteChannel.Java:421)
at com.google.cloud.hadoop.util.AbstractGoogleAsyncWriteChannel.close(AbstractGoogleAsyncWriteChannel.Java:287)
at org.Apache.beam.sdk.io.FileBasedSink$Writer.close(FileBasedSink.Java:1007)
at org.Apache.beam.sdk.io.WriteFiles$WriteShardsIntoTempFilesFn.processElement(WriteFiles.Java:726)
at org.Apache.beam.sdk.io.WriteFiles$WriteShardsIntoTempFilesFn$DoFnInvoker.invokeProcessElement(Unknown Source)
すべてのアプリケーションがドレインおよび再デプロイされましたが、しばらくすると(3〜4時間の期間)同じことが起こりました。それらの一部は40日以上実行されていましたが、コードに変更を加えることなく、突然この問題に陥りました。
この問題の理由を知るためにいくつかの助けをお願いしたいと思います。これらは、これらの問題のある一部のDataflowジョブの次のIDです。
BigQuery出力のスタック:2019-03-04_04_46_31-390197710764972657
Cloud Storageの出力で立ち往生:2019-03-04_07_50_00-10623118563101608836
Processing stuck
メッセージは、パイプラインが実際にスタックしていることを必ずしも意味しません。これらのメッセージは、同じ操作を5分以上実行しているワーカーによってログに記録されます。
多くの場合、これは単に遅い操作を示しています:外部RPC、または外部プロセスの待機(BigQueryへのロードまたはクエリジョブの実行時に非常に一般的)。
この種のメッセージがパイプラインで頻繁に発生している場合や、数値が高い場合(5m
、10m
、50m
、1h
など)、おそらくスタックを示していますが、パイプラインで時々見られる場合は、心配する必要はありません。
Beamの古いバージョン(2.5.0から2.8.0まで)では、デフォルトのセキュリティプロバイダーとして使用されていたConscryptライブラリにデッドロックの問題があったことを考慮する価値があります。 Beam 2.9.0、Conscryptはデフォルトのセキュリティプロバイダーではなくなりました 。
別のオプションは、ConscryptもデフォルトのプロバイダーではなかったBeam 2.4.0にダウングレードすることです。
同じエラーが発生しましたが、その理由は、スキーマを指定せずに空のBigQueryテーブルを作成したためです。 Dataflowを介してデータを読み込む前に、必ずスキーマを含むBQテーブルを作成してください。
同じ問題が発生していますが、最も一般的なケースは、ジョブの1つがBigQueryテーブルに挿入できなかったか、ファイルをCGSバケットに保存できなかったことが原因であることがわかりました(非常に珍しい)。担当スレッドは例外をキャッチせず、ジョブを待ち続けます。これはApache Beamのバグで、すでにチケットを作成しています。
https://issues.Apache.org/jira/plugins/servlet/mobile#issue/BEAM-769
Apache Beamの担当者がこの問題を修正するかどうか確認してみましょう(これは、文字通り未処理の例外です)。
これまでのところ、挿入前にデータの制約を検証することをお勧めします。したがって、次のようなことを覚えておいてください。1)最大行サイズ(現在の2019年は、ストリーム挿入では1MB、バッチでは100MBです)2)来ていない必須の値は、ジョブの前にデッドレターを作成し、ジョブに到達できない3)不明なフィールドがある場合は、オプションignoreUnknownFieldsを有効にすることを忘れないでください(そうしないと、ジョブが停止します)。
より多くの「満たされていない」イベントが来るため、ピーク時にのみ問題が発生していると思います。
うまくいけば、これは少し役立つかもしれません