ストリーミングジョブのモニタリングは、ETL パイプラインを構築するうえで極めて重要です。Spark UI を使用する以外に、Amazon CloudWatch を使用してメトリクスをモニタリングすることもできます。以下は、AWS Glue フレームワークによって出力されるストリーミングメトリクスのリストです。すべての AWS Glue メトリクスが含まれる完全なリストについては、「Amazon CloudWatch メトリクスを使用した AWS Glue のモニタリング」を参照してください。
AWS Glue では、構造化されたストリーミングフレームワークを使用して入力イベントを処理します。Spark API をコード内で直接使用することも、これらのメトリクスを発行する GlueContext
で提供された ForEachBatch
を利用することもできます。これらのメトリクスを理解するには、まず windowSize
を理解する必要があります。
windowSize: windowSize
は、指定するマイクロバッチの間隔です。ウィンドウサイズを 60 秒に指定すると、AWS Glue Streaming ジョブは 60 秒 (それまでに前のバッチが完了していない場合はそれ以上) 待ってから、ストリーミングソースからバッチのデータを読み取り、ForEachBatch
で提供される変換を適用します。これはトリガー間隔とも呼ばれます。
メトリクスを詳しく見直して、ヘルスとパフォーマンスの特徴を理解しましょう。
注記
メトリクスは 30 秒ごとに出力されます。windowSize
が 30 秒未満の場合、報告されるメトリクスは集計されたものとなります。例えば、windowSize
が 10 秒で、マイクロバッチあたり 20 件のレコードを安定して処理しているとします。このシナリオでは、numRecords の出力メトリクス値は 60 になります。
メトリクスは、使用できるデータがない場合は出力されません。また、コンシューマーラグメトリクスの場合は、そのメトリクスを取得する機能を有効にする必要があります。
最高のパフォーマンスを得る方法
Spark は、Amazon Kinesis ストリーム内の読み取りのために、シャードごとに 1 つのタスクを作成しようとします。各シャードのデータはパーティションになります。次に、各ワーカーのコア数に応じて、これらのタスクをエグゼキュター/ワーカーに分散します (ワーカーあたりのコア数は、選択したワーカータイプ (G.025X
や G.1X
など) によって異なります)。ただし、タスクがどのように分散されるかは非決定論的です。すべてのタスクは、それぞれのコアで並列実行されます。使用可能なエグゼキュターコアの数よりも多くのシャードがある場合、タスクはキューに入れられます。
上記のメトリクスとシャード数を組み合わせて、バーストのための余裕がある安定した負荷が実現するようにエグゼキュターをプロビジョニングできます。おおよそのワーカー数を決定するために、ジョブを数回繰り返すことをお勧めします。不安定で急激なワークロードの場合も、自動スケーリングと最大ワーカー数を設定することで同じことを実行できます。
windowSize
は、ビジネスの SLA 要件に従って設定してください。例えば、処理されたデータが 120 秒を超えてはならないことをビジネスで義務付けている場合は、平均コンシューマーラグが 120 秒未満になるように windowSize
を少なくとも 60 秒に設定します (前述のコンシューマーラグに関するセクションを参照)。そこから、numRecords
とシャード数に応じて、DPU の容量を計画し、batchProcessingTimeInMs
がほとんどいつも windowSize
の 70% 未満になるようにします。
注記
ホットシャードはデータスキューの原因となる可能性があります。つまり、一部のシャード/パーティションが他のシャード/パーティションよりもはるかに大きくなる可能性があります。これにより、並列実行されている一部のタスクに時間がかかり、ストラグラータスクが発生する場合があります。その結果、前のバッチのすべてのタスクが完了するまで次のバッチを開始できず、これが batchProcessingTimeInMillis
と最大ラグに影響することになります。