メインコンテンツまでスキップ

Spark UI を使用したデバッグ

この記事では、いくつかの デバッグ オプションを Apache Sparkアプリケーション:

  • Spark UI
  • ドライバーログ
  • エグゼキューター logs

Spark UI を使用したコストとパフォーマンスの問題の診断については、「 Spark UI を使用したコストとパフォーマンスの問題の診断 」を参照してください。

Spark UI

ジョブを開始すると、Spark UI にアプリケーションで何が起こっているかに関する情報が表示されます。Spark UIにアクセスするには、 コンピュート ページからコンピュートを選択し、 Spark UI タブをクリックします。

Spark UI

「ストリーミング」タブ

Spark UI内で、ストリーミング タブが表示されます ストリーミング ジョブがコンピュートで実行されている場合。このコンピュートでストリーミングジョブが実行されていない場合、このタブは表示されません。 ドライバー ログにスキップして、ストリーミング ジョブの開始中に発生した可能性のある例外を確認する方法を学習できます。

このページでは、ストリーミングアプリケーションがソースから入力イベントを受信しているかどうかを確認できます。たとえば、ジョブが 1000 イベント/秒を受信していることがわかります。

注記

TextFileStreamの場合、ファイルは入力されるため、入力イベントの # は常に 0 です。このような場合は、ノートブックの 完了したバッチ セクションを見て、詳細情報を見つける方法を理解できます。

複数の入力ストリームを受信するアプリケーションがある場合は、[ 入力レート ] リンクをクリックすると、各レシーバーで受信したイベントの # が表示されます。

処理時間

下にスクロールしながら、 処理時間 のグラフを見つけます。 これは、ストリーミングジョブのパフォーマンスを理解するための重要なグラフの 1 つです。 一般的な経験則として、各バッチをバッチ処理時間の80%以内に処理できれば良いでしょう。

平均処理時間がバッチ間隔に近いか長い場合、ストリーミング アプリケーションがキューに入り始め、すぐにバックログが発生し、最終的にストリーミング ジョブがダウンする可能性があります。

完了したバッチ

ページの最後に、完了したすべてのバッチのリストが表示されます。このページには、完了した最後の 1000 個のバッチに関する詳細が表示されます。表から、各バッチで処理されたイベントの # とその処理時間を取得できます。いずれかで何が起こったかについて詳しく知りたい場合は、 バッチ リンクをクリックして バッチ 詳細 ページに移動します。

バッチ詳細ページ

バッチの詳細 ページには、バッチに関するすべての詳細が表示されます。次の 2 つの重要な点があります。

  • 入力: バッチへの入力に関する詳細が表示されます。 この場合、このバッチのSpark構造化ストリーミングによって読み取られたApache Kafkaトピック、パーティション、およびオフセットに関する詳細が含まれます。TextFileStream の場合は、このバッチで読み取られたファイル名の一覧が表示されます。 これは、テキスト・ファイルから読み取っているストリーミング・アプリケーションのデバッグを開始するのに最適な方法です。
  • 処理中: このバッチ中に行われた処理に関するすべての詳細が記載されたジョブ ID へのリンクをクリックできます。

ジョブの詳細ページ

ジョブの詳細ページには、DAG の視覚化が表示されます。これは、各バッチの操作の順序と依存関係を理解するのに役立ちます。たとえば、これは、Kafka ダイレクトストリームからのバッチ読み取り入力、フラットマップ操作、次にマップ操作を行い、結果のストリームを使用して updateStateByKey を使用してグローバル状態を更新したことを示すことができます。

グレーのボックスは、スキップされたステージを表します。Spark は、再計算する必要がない場合は、一部のステージをスキップできるほど賢いです。データがチェックポイントまたはキャッシュされている場合、Spark はこれらのステージの再計算をスキップします。前のストリーミングの例では、これらのステージは、 updateStateBykeyのため、以前のバッチへの依存関係に対応しています。Spark構造化ストリーミングは内部的にストリームをチェックし、前のバッチに依存するのではなくチェックポイントから読み取るため、グレー表示されたステージとして表示されます。

ページの下部には、このバッチに対して実行されたジョブのリストも表示されます。 説明のリンクをクリックすると、タスク レベルの実行をさらに詳しく調べることができます。

タスクの詳細ページ

これは最も詳細なレベルの デバッグ SparkアプリケーションのためにSpark UIから取得できます。このページには、このバッチに対して実行されたすべてのタスクが含まれています。ストリーミングアプリケーションのパフォーマンスの問題を調査する場合、このページには、実行されたタスクの数、実行された場所(どのエグゼキューター)やシャッフル情報などの情報が表示されます。

ヒント

タスクがコンピュート内の複数のエグゼキューター (ノード) で実行されることを確認し、処理中に十分な並列処理を確保します。 レシーバーが 1 人の場合、コンピュートに複数のエグゼキューターがあっても、1 人のエグゼキューターだけがすべての作業を行っている場合があります。

スレッドダンプ

スレッド・ダンプは、JVM のスレッド状態のスナップショットを示します。

スレッドダンプは、特定のハングアップしたタスクや実行速度の遅いタスクをデバッグする場合に便利です。Spark UI で特定のタスクのスレッドダンプを表示するには:

  1. 「ジョブ」 タブをクリックします。
  2. 「ジョブ」 テーブルで、表示したいスレッド・ダンプに対応するターゲット・ジョブを見つけ、「 説明 」列のリンクをクリックします。
  3. ジョブの 「ステージ」 テーブルで、表示したいスレッド・ダンプに対応するターゲット・ステージを見つけ、「 説明 」列のリンクをクリックします。
  4. ステージの タスク リストで、表示するスレッドダンプに対応するターゲットタスクを見つけ、その タスク IDエグゼキューター ID の値をメモします。
  5. エグゼキューター タブをクリックします。
  6. エグゼキューター テーブルで、前にメモした エグゼキューター ID 値に対応する エグゼキューター ID 値を含む行を見つけます。その行で、[ スレッド ダンプ ] 列のリンクをクリックします。
  7. [エグゼキューターのスレッド ダンプ ] テーブルで、[ スレッド名 ] 列に TID が含まれ、その後に前にメモした タスク ID 値が続く行をクリックします。(タスクの実行が終了した場合、一致するスレッドは見つかりません)。タスクのスレッド・ダンプが表示されます。

スレッド ダンプは、ドライバーがハングしているように見える (Spark の進行状況バーが表示されないなど) や、クエリの進行状況が進まない (Spark の進行状況バーが 100% でスタックしているなど) 問題のデバッグにも役立ちます。Spark UI でドライバーのスレッド ダンプを表示するには:

  1. エグゼキューター タブをクリックします。
  2. エグゼキューター テーブルの ドライバー 行で、[ スレッド ダンプ ] 列のリンクをクリックします。ドライバーのスレッド ダンプが表示されます。

ドライバー ログ

ドライバーログは、次の場合に役立ちます。

  • 例外: Spark UI に [ストリーミング] タブが表示されない場合があります。これは、何らかの例外によりストリーミングジョブが開始されなかったためです。ドライバー ログをドリルダウンして、例外のスタック トレースを確認できます。場合によっては、ストリーミングジョブが正常に開始されている可能性があります。ただし、すべてのバッチが [完了したバッチ] セクションに移動しないことがわかります。それらはすべて処理中または失敗状態である可能性があります。このような場合、ドライバー ログは、根本的な問題の性質を理解するのにも役立ちます。
  • 印刷: DAG の一部としての印刷ステートメントは、ログにも表示されます。
注記

ドライバーログにアクセスできるユーザーは、コンピュートリソースのアクセスモードによって異なります。 標準 アクセス モードのコンピュートの場合、ワークスペース管理者のみがドライバー ログにアクセスできます。 専用 アクセスモードのコンピュートの場合、専用ユーザーまたはグループとワークスペースの管理者はドライバーログにアクセスできます。

エグゼキューター logs

エグゼキューターログは、特定のタスクが誤動作していることに気付き、特定のタスクのログを確認したい場合に役立ちます。 上記のタスクの詳細ページから、タスクが実行されたエグゼキューターを取得できます。それができたら、コンピュートUIページに移動し、#ノードをクリックしてからマスターをクリックします。 マスター ページには、すべてのワーカーが一覧表示されます。疑わしいタスクが実行されたワーカーを選択し、log4j 出力にアクセスできます。

注記

エグゼキューターのログは、 スタンダード アクセスモードのコンピュートでは使用できません。 専用 アクセスモードのコンピュートの場合、専用ユーザーまたはグループとワークスペースの管理者はエグゼキューターのログにアクセスできます。