Web UI
Apache Sparkは、Sparkクラスターのステータスとリソース消費量を監視するために使用できるWebユーザーインターフェイス(UI)のスイートを提供します。
目次
- Jobsタブ
- Stagesタブ
- Storageタブ
- Environmentタブ
- Executorsタブ
- SQLタブ
- 構造化ストリーミングタブ
- ストリーミング(DStreams)タブ
- JDBC/ODBCサーバータブ
Jobsタブ
Jobsタブには、Sparkアプリケーション内のすべてのジョブのサマリーページと、各ジョブの詳細ページが表示されます。サマリーページには、すべてのジョブのステータス、期間、進捗状況、および全体的なイベントタイムラインなどの高レベルの情報が表示されます。サマリーページでジョブをクリックすると、そのジョブの詳細ページが表示されます。詳細ページには、イベントタイムライン、DAGの視覚化、およびジョブのすべてのステージがさらに表示されます。
このセクションに表示される情報は次のとおりです。
- ユーザー:現在のSparkユーザー
- 合計稼働時間:Sparkアプリケーションが開始されてからの時間
- スケジューリングモード:ジョブスケジューリングを参照してください
- ステータスごとのジョブ数:アクティブ、完了、失敗
- イベントタイムライン:エグゼキューター(追加、削除)およびジョブに関連するイベントを時系列順に表示します
- ステータスごとにグループ化されたジョブの詳細:ジョブID、説明(詳細ジョブページへのリンク付き)、送信時間、期間、ステージの概要、およびタスクの進捗状況バーなどのジョブの詳細情報を表示します
特定のジョブをクリックすると、このジョブの詳細情報を確認できます。
ジョブの詳細
このページには、ジョブIDで識別される特定のジョブの詳細が表示されます。
- ジョブステータス:(実行中、成功、失敗)
- ステータスごとのステージ数(アクティブ、保留中、完了、スキップ、失敗)
- 関連するSQLクエリ:このジョブのSQLタブへのリンク
- イベントタイムライン:エグゼキューター(追加、削除)およびジョブのステージに関連するイベントを時系列順に表示します
- DAGの視覚化:頂点がRDDまたはデータフレームを表し、エッジがRDDに適用される操作を表す、このジョブの有向非巡回グラフの視覚的な表現。
sc.parallelize(1 to 100).toDF.count()
のDAG視覚化の例
- ステージのリスト(状態アクティブ、保留中、完了、スキップ、失敗でグループ化)
- ステージID
- ステージの説明
- 送信タイムスタンプ
- ステージの期間
- タスクの進捗状況バー
- 入力:このステージでストレージから読み取られたバイト数
- 出力:このステージでストレージに書き込まれたバイト数
- シャッフル読み取り:読み取られた合計シャッフルバイト数とレコード数。ローカルで読み取られたデータとリモートエグゼキューターから読み取られたデータの両方が含まれます
- シャッフル書き込み:将来のステージでシャッフルで読み取られるためにディスクに書き込まれたバイト数とレコード数
Stagesタブ
Stagesタブには、Sparkアプリケーション内のすべてのジョブのすべてのステージの現在の状態を示すサマリーページが表示されます。
ページの一番上には、ステータス(アクティブ、保留中、完了、スキップ、失敗)ごとのすべてのステージのカウントを含むサマリーがあります
フェアスケジューリングモードでは、プールのプロパティを表示するテーブルがあります
その後、ステータス(アクティブ、保留中、完了、スキップ、失敗)ごとのステージの詳細が続きます。アクティブなステージでは、killリンクでステージを停止できます。失敗したステージでのみ、失敗理由が表示されます。タスクの詳細は、説明をクリックすることでアクセスできます。
ステージの詳細
ステージの詳細ページは、すべてのタスクでの合計時間、局所性レベルの概要、シャッフル読み取りサイズ/レコード、および関連するジョブIDなどの情報から始まります。
また、このステージの有向非巡回グラフ(DAG)の視覚的な表現もあります。ここでは、頂点がRDDまたはデータフレームを表し、エッジが適用される操作を表します。ノードは、DAG視覚化で操作スコープごとにグループ化され、操作スコープ名(BatchScan、WholeStageCodegen、Exchangeなど)でラベル付けされます。特に、Whole Stage Code Generation操作には、コード生成IDもアノテーションが付けられています。Spark DataFrameまたはSQL実行に属するステージの場合、これにより、SQLプラングラフと実行プランがレポートされるWeb-UI SQLタブページの関連する詳細にステージ実行の詳細を相互参照できます。
すべてのタスクのサマリーメトリクスは、テーブルとタイムラインで表示されます。
- タスクのデシリアライズ時間
- タスクの期間.
- GC時間は、JVMの合計ガベージコレクション時間です。
- 結果シリアライズ時間は、タスクの結果をエグゼキューターでシリアライズしてから、ドライバーに送り返すまでに費やされた時間です。
- 結果取得時間は、ドライバーがワーカーからタスクの結果をフェッチするのに費やす時間です。
- スケジューラ遅延は、タスクが実行のためにスケジュールされるのを待機する時間です。
- ピーク実行メモリは、シャッフル、集計、および結合中に作成された内部データ構造によって使用される最大メモリです。
- シャッフル読み取りサイズ/レコード。読み取られた合計シャッフルバイト数には、ローカルで読み取られたデータとリモートエグゼキューターから読み取られたデータの両方が含まれます。
- シャッフル読み取りフェッチ待機時間は、リモートマシンからシャッフルデータを読み取るのを待機してタスクがブロックされた時間です。
- シャッフルリモート読み取りは、リモートエグゼキューターから読み取られた合計シャッフルバイト数です。
- シャッフル書き込み時間は、タスクがシャッフルデータの書き込みに費やした時間です。
- シャッフルスピル(メモリ)は、メモリ内のシャッフルされたデータのデシリアライズされた形式のサイズです。
- シャッフルスピル(ディスク)は、ディスク上のデータのシリアライズされた形式のサイズです。
エグゼキューター別の集計メトリクスは、エグゼキューターによって集計された同じ情報を示します。
アキュムレータは、共有変数のタイプです。これにより、さまざまな変換内で更新できる変更可能な変数が提供されます。名前付きおよび名前なしでアキュムレータを作成できますが、名前付きのアキュムレータのみが表示されます。
タスクの詳細には、基本的にサマリーセクションと同じ情報が含まれていますが、タスクごとに詳細が表示されます。また、ログを確認するためのリンクと、何らかの理由で失敗した場合のタスク試行回数も含まれます。名前付きアキュムレータがある場合、ここでは各タスクの終了時にアキュムレータの値を確認できます。
Storageタブ
Storageタブには、アプリケーションに存在する場合は、永続化されたRDDとデータフレームが表示されます。サマリーページには、すべてのRDDのストレージレベル、サイズ、パーティションが表示され、詳細ページには、RDDまたはデータフレーム内のすべてのパーティションのサイズと使用中のエグゼキューターが表示されます。
scala> import org.apache.spark.storage.StorageLevel._
import org.apache.spark.storage.StorageLevel._
scala> val rdd = sc.range(0, 100, 1, 5).setName("rdd")
rdd: org.apache.spark.rdd.RDD[Long] = rdd MapPartitionsRDD[1] at range at <console>:27
scala> rdd.persist(MEMORY_ONLY_SER)
res0: rdd.type = rdd MapPartitionsRDD[1] at range at <console>:27
scala> rdd.count
res1: Long = 100
scala> val df = Seq((1, "andy"), (2, "bob"), (2, "andy")).toDF("count", "name")
df: org.apache.spark.sql.DataFrame = [count: int, name: string]
scala> df.persist(DISK_ONLY)
res2: df.type = [count: int, name: string]
scala> df.count
res3: Long = 3
上記の例を実行した後、Storageタブに2つのRDDがリストされていることがわかります。ストレージレベル、パーティション数、メモリオーバーヘッドなどの基本情報が提供されます。新しく永続化されたRDDまたはデータフレームは、具体化されるまでタブに表示されないことに注意してください。特定のRDDまたはデータフレームを監視するには、アクション操作がトリガーされていることを確認してください。
クラスターでのデータの分散など、データ永続性の詳細を取得するには、RDD名「rdd」をクリックできます。
Environmentタブ
Environmentタブには、JVM、Spark、システムプロパティなど、さまざまな環境および構成変数の値が表示されます。
この環境ページには5つの部分があります。プロパティが正しく設定されているかどうかを確認するのに便利な場所です。最初の部分「ランタイム情報」には、JavaやScalaのバージョンなどのランタイムプロパティが含まれています。2番目の部分「Sparkプロパティ」には、「spark.app.name」や「spark.driver.memory」などのアプリケーションプロパティがリストされています。
「Hadoopプロパティ」リンクをクリックすると、HadoopとYARNに関連するプロパティが表示されます。「spark.hadoop.*」のようなプロパティは、この部分ではなく「Sparkプロパティ」に表示されることに注意してください。
「システムプロパティ」には、JVMに関する詳細が表示されます。
最後の部分「クラスパスエントリ」には、さまざまなソースからロードされたクラスがリストされており、クラスの競合を解決するのに非常に役立ちます。
Executorsタブ
Executorsタブには、アプリケーション用に作成されたエグゼキューターに関するサマリー情報(メモリとディスクの使用量、タスクとシャッフルの情報など)が表示されます。ストレージメモリ列には、データのキャッシュに使用および予約されたメモリの量が表示されます。
Executorsタブには、リソース情報(各エグゼキューターで使用されるメモリ、ディスク、コアの量)だけでなく、パフォーマンス情報(GC時間とシャッフル情報)も表示されます。
エグゼキューター0の「stderr」リンクをクリックすると、そのコンソールに詳細な標準エラーログが表示されます。
エグゼキューター0の「スレッドダンプ」リンクをクリックすると、エグゼキューター0のJVMのスレッドダンプが表示され、これはパフォーマンス分析に非常に役立ちます。
SQLタブ
アプリケーションがSpark SQLクエリを実行する場合、SQLタブには、クエリの期間、ジョブ、物理プラン、論理プランなどの情報が表示されます。ここでは、このタブを説明するための基本的な例を含めます
scala> val df = Seq((1, "andy"), (2, "bob"), (2, "andy")).toDF("count", "name")
df: org.apache.spark.sql.DataFrame = [count: int, name: string]
scala> df.count
res0: Long = 3
scala> df.createGlobalTempView("df")
scala> spark.sql("select name,sum(count) from global_temp.df group by name").show
+----+----------+
|name|sum(count)|
+----+----------+
|andy| 3|
| bob| 2|
+----+----------+
上記の3つのデータフレーム/SQL演算子がリストに表示されています。最後のクエリの「<console>: 24 で表示」リンクをクリックすると、クエリ実行のDAGと詳細が表示されます。
クエリ詳細ページには、クエリの実行時間、期間、関連するジョブのリスト、およびクエリ実行DAGに関する情報が表示されます。最初のブロック「WholeStageCodegen (1)」は、複数の演算子(「LocalTableScan」および「HashAggregate」)を1つのJava関数にまとめてコンパイルし、パフォーマンスを向上させます。行数やスピルサイズなどのメトリクスがブロックにリストされています。ブロック名の「(1)」は、コード生成IDです。2番目のブロック「Exchange」には、書き込まれたシャッフルレコード数、合計データサイズなど、シャッフルエクスチェンジに関するメトリクスが表示されます。
下部にある「詳細」リンクをクリックすると、論理プランと物理プランが表示され、Sparkがクエリをどのように解析、分析、最適化、実行するかが示されます。ホールステージコード生成最適化の対象となる物理プランのステップには、アスタリスクに続いてコード生成IDがプレフィックスとして付加されます。例:「*(1) LocalTableScan」
SQLメトリクス
SQL演算子のメトリクスは、物理演算子のブロックに表示されます。SQLメトリクスは、各演算子の実行詳細を詳しく調べたい場合に役立ちます。たとえば、「出力行数」は、Filter演算子後に出力された行数を示し、Exchange演算子の「シャッフル書き込みバイト数合計」は、シャッフルによって書き込まれたバイト数を示します。
以下はSQLメトリクスのリストです
SQLメトリクス | 意味 | 演算子 |
---|---|---|
出力行数 | 演算子の出力行数 | 集計演算子、結合演算子、Sample、Range、スキャン演算子、Filterなど |
データサイズ | 演算子のブロードキャスト/シャッフル/収集されたデータのサイズ | BroadcastExchange、ShuffleExchange、Subquery |
収集時間 | データの収集にかかった時間 | BroadcastExchange、Subquery |
スキャン時間 | データのスキャンにかかった時間 | ColumnarBatchScan、FileSourceScan |
メタデータ時間 | パーティション数、ファイル数などのメタデータの取得にかかった時間 | FileSourceScan |
シャッフル書き込みバイト数 | 書き込まれたバイト数 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
シャッフル書き込みレコード数 | 書き込まれたレコード数 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
シャッフル書き込み時間 | シャッフル書き込みにかかった時間 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
リモートブロック読み取り | リモートで読み取られたブロック数 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
リモート読み取りバイト数 | リモートで読み取られたバイト数 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
リモートからディスクへの読み取りバイト数 | リモートからローカルディスクに読み取られたバイト数 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
ローカルブロック読み取り | ローカルで読み取られたブロック数 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
ローカル読み取りバイト数 | ローカルで読み取られたバイト数 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
フェッチ待機時間 | データのフェッチ(ローカルおよびリモート)にかかった時間 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
読み取りレコード数 | 読み取られたレコード数 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
ソート時間 | ソートにかかった時間 | Sort |
ピークメモリ | 演算子でのピークメモリ使用量 | Sort、HashAggregate |
スピルサイズ | 演算子でメモリからディスクにスピルされたバイト数 | Sort、HashAggregate |
集計構築にかかる時間 | 集計にかかった時間 | HashAggregate、ObjectHashAggregate |
ハッシュプローブバケットリスト反復の平均 | 集計中のルックアップごとのバケットリスト反復の平均 | HashAggregate |
ビルド側のデータサイズ | 構築されたハッシュマップのサイズ | ShuffledHashJoin |
ハッシュマップの構築にかかる時間 | ハッシュマップの構築にかかった時間 | ShuffledHashJoin |
タスクコミット時間 | 書き込みが成功した後、タスクの出力をコミットするのに費やされた時間 | ファイルベースのテーブルに対する書き込み操作 |
ジョブコミット時間 | 書き込みが成功した後、ジョブの出力をコミットするのに費やされた時間 | ファイルベースのテーブルに対する書き込み操作 |
Pythonワーカーに送信されたデータ | Pythonワーカーに送信されたシリアル化データのバイト数 | ArrowEvalPython、AggregateInPandas、BatchEvalPython、FlatMapGroupsInPandas、FlatMapsCoGroupsInPandas、FlatMapsCoGroupsInPandasWithState、MapInPandas、PythonMapInArrow、WindowsInPandas |
Pythonワーカーから返されたデータ | Pythonワーカーから返されたシリアル化データのバイト数 | ArrowEvalPython、AggregateInPandas、BatchEvalPython、FlatMapGroupsInPandas、FlatMapsCoGroupsInPandas、FlatMapsCoGroupsInPandasWithState、MapInPandas、PythonMapInArrow、WindowsInPandas |
構造化ストリーミングタブ
マイクロバッチモードで構造化ストリーミングジョブを実行する場合、Web UIで構造化ストリーミングタブが利用可能になります。概要ページには、実行中および完了したクエリに関する簡単な統計が表示されます。また、失敗したクエリの最新の例外を確認することもできます。詳細な統計については、テーブルの「run id」をクリックしてください。
統計ページには、ストリーミングクエリのステータスを把握するための便利なメトリクスが表示されます。現在、次のメトリクスが含まれています。
- 入力レート。データが到着する集計(すべてのソースにわたる)レート。
- 処理レート。Sparkがデータを処理している集計(すべてのソースにわたる)レート。
- 入力行。トリガーで処理された集計(すべてのソースにわたる)レコード数。
- バッチ期間。各バッチの処理期間。
- 操作期間。さまざまな操作を実行するのにかかる時間(ミリ秒単位)。追跡される操作は次のとおりです。
- addBatch:マイクロバッチの入力データをソースから読み取り、処理し、バッチの出力をシンクに書き込むのにかかる時間。これは、マイクロバッチの時間の大半を占めるはずです。
- getBatch:現在のマイクロバッチの入力をソースから読み取るための論理クエリを準備するのにかかる時間。
- latestOffset & getOffset:このソースで使用可能な最大オフセットをクエリするのにかかる時間。
- queryPlanning:実行プランを生成するのにかかる時間。
- walCommit:オフセットをメタデータログに書き込むのにかかる時間。
- グローバルウォーターマークギャップ。バッチタイムスタンプとバッチのグローバルウォーターマークとの間のギャップ。
- 合計状態行の集計数。合計状態行の集計数。
- 更新された状態行の集計数。更新された状態行の集計数。
- 使用された集計状態メモリ(バイト単位)。使用された集計状態メモリ(バイト単位)。
- ウォーターマークによってドロップされた状態行の集計数。ウォーターマークによってドロップされた状態行の集計数。
早期リリースバージョンとして、統計ページはまだ開発中であり、将来のリリースで改善される予定です。
ストリーミング(DStreams)タブ
アプリケーションがDStream APIでSpark Streamingを使用している場合、Web UIにはストリーミングタブが含まれます。このタブには、データストリームの各マイクロバッチのスケジューリング遅延と処理時間が表示され、ストリーミングアプリケーションのトラブルシューティングに役立ちます。
JDBC/ODBCサーバータブ
Sparkが分散SQLエンジンとして実行されている場合、このタブが表示されます。セッションと送信されたSQL操作に関する情報が表示されます。
ページの最初のセクションには、JDBC/ODBCサーバーに関する一般的な情報(開始時刻と稼働時間)が表示されます。
2番目のセクションには、アクティブおよび完了したセッションに関する情報が含まれています。
- 接続のユーザーとIP。
- セッション情報にアクセスするためのセッションIDリンク。
- セッションの開始時刻、終了時刻、および期間。
- 合計実行は、このセッションで送信された操作の数です。
3番目のセクションには、送信された操作のSQL統計があります。
- 操作を送信するユーザー。
- ジョブタブへのジョブIDリンク。
- すべてのジョブをグループ化するクエリのグループID。アプリケーションはこのグループIDを使用して、実行中のすべてのジョブをキャンセルできます。
- 操作の開始時刻。
- 結果をフェッチする前の実行の終了時刻。
- 結果をフェッチした後の操作の終了時間。
- 実行時間は、終了時間と開始時間の差です。
- 期間時間は、終了時間と開始時間の差です。
- ステートメントは、実行中の操作です。
- プロセスの状態。
- 開始済み、最初の状態、プロセスが開始されるとき。
- コンパイル済み、実行プランが生成されます。
- 失敗、実行が失敗したか、エラーで終了したときの最終状態。
- キャンセル済み、実行がキャンセルされたときの最終状態。
- 完了、処理を完了し、結果のフェッチを待機しています。
- 終了、クライアントがステートメントを閉じたときの最終状態。
- 解析された論理プラン、分析された論理プラン、最適化された論理プラン、物理プラン、またはSQLステートメントのエラーを含む実行プランの詳細。