注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
Apache Spark は、Foundry のデータ統合レイヤーで最も一般的に使用される実行エンジンです。パイプラインのパフォーマンス特性を理解し、パイプラインの最適化方法を見つけるためには、Spark でのコードの実行方法の詳細を理解することが重要です。Foundry は、Spark でのジョブのパフォーマンスを表示し、理解するための統合ツールを提供しています。このページでは、利用可能な Spark の詳細を概説し、それらの詳細が意味することについてのガイダンスを提供します。
Foundry で構築されたデータセットについては、Spark の詳細を表示するために以下の手順を実行します。
Spark の詳細ページは、Spark でのジョブの実行に関する情報を提供します。各ジョブについて、Spark の詳細ページでは、以下に示すように、さまざまなカテゴリで情報が表示されます。
概要タブでは、ジョブに関する以下の情報が提供されます。
これらの2つのメトリクスを使用して、並列性の比率を次のように計算できます。
すべてのタスクの合計ランタイム / ジョブ持続時間
比率が1に近いと、並列性が低いことを示します。
ディスクのスピル: すべてのステージ全体で、エクスキュータの RAM からディスクに移動されたデータのサイズ。
シャッフルの書き込み: ジョブ全体で、すべてのステージでシャッフルされたデータの量。
ジョブの開始時に、Spark はトランスフォームのコードを解釈して実行計画を作成します。これは、相互依存関係を持つ一連のステージとして表現できます。次のグラフは、ステージの実行タイムラインを示しています。
最も左側のステージは通常、入力の読み込みを表し、最も右側のステージは通常、出力の書き込みを表します。 上記の例では、ステージ 28、30、31、32、33、および 35 の実行に時間がかかるため、このジョブのランタイムを最適化する良い候補です。
ステージ 28、30、31、33、および 35 は並行して実行できるため、相互依存関係はありません。ただし、ステージ 32 は、すべての前のステージが終了したときにのみ開始されるため、以下のことが示されます。
タスク並行性チャートは、リソースの使用状況を理解するのに役立ちます。ステージの並行性を時間とともにプロットします。ジョブの並行性と同様に、ステージの並行性は次のように計算できます。
ステージ内のタスクの合計ランタイム / ステージの持続時間
タスク並行性チャートの時間軸は、上のガントチャートのステージと共有されているため、相関関係を特定しやすくなっています。
上記のチャートでは、ステージ 32 の並行性はほぼ 1 です。これは、このステージで行われるほぼすべての作業が 1 つの(非常に長い)タスクで行われることを意味し、計算が分散されていないことを示しています。
完全に分散されたジョブは、次のようになります。
特定のステージが失敗したり遅かったりする理由を理解しようとするとき、さらに情報が役立ちます。残念ながら、ステージがどのようにして元のコードや物理プランに遡るのかを自動的に追跡することは現在、Spark がコードをステージに変換するときにこのデータフローを公開していないため、不可能です。
ステージの概要は、失敗したり長時間実行されたりするステージの調査に役立ちます。
タスクの半分は 2 秒未満で終了しますが、もっとも興味深いのは最大ランタイムです。1 つのタスクがステージの合計ランタイムの約 63% を占めています。これは、前述のチャートで示されたように、このステージがボトルネックであり、ほぼすべての作業が 1 つのタスクで行われていることと一致しています。
詳細を知るために、ステージの詳細にジャンプできます。
これは、このステージで実行されたタスクのサンプルと、ステージ自体に関連するメトリクスを示しています。
タスク 22267-0 は 1 時間 16 分かかるので、最も遅いものです。実際、このタスクは 81M の行を処理していますが、他のタスクは 10K ~ 700K の行を処理しています。この歪みの症状は次のとおりです。
エグゼキュータ タブは、Spark ジョブのドライバーやエグゼキュータから特定のメトリクスを取得し、スタックトレースやメモリヒストグラムを含みます。これらのメトリクスは、Spark ジョブのパフォーマンス問題をデバッグする際に役立ちます。
スナップショット ボタンを選択すると、実行中のジョブから Java スタックトレースまたはドライバー専用のメモリヒストグラムがキャプチャされます。ジョブが実行中の状態でなければなりません(ジョブが完了している場合、これらのメトリクスはもう収集できません)。
スタックトレースは、Spark ジョブの各スレッドがその時点で実行している内容を確認する方法です。例えば、ジョブがハングしているように見える場合(つまり、進行が期待通りでない場合)、スタックトレースを取得することで、その時点で実行されている内容が明らかになります。
メモリヒストグラムは、現在ヒープ上にある Java オブジェクトの数とそのサイズ(バイト単位)を表示します。メモリの使用状況を理解し、メモリ関連の問題をデバッグする際に役立ちます。
メトリクスを取得することで、実行中のジョブのパフォーマンスに影響があることに注意してください。これらのメトリクスの収集は、JVM が行う追加の作業です。例えば、メモリヒストグラムの取得はガーベジコレクションをトリガーします。