Spark Web UI - Sparkの処理を理解する

[Spark Web UI \- Understanding Spark Execution — SparkByExamples](https://sparkbyexamples.com/spark/spark-web-ui-understanding/)の翻訳です。

Apache Sparkは、ご自身のSpark/PySparkアプリケーション、Sparkクラスターのリソース消費、Spark設定をモニタリングするためのWeb UI/ユーザーインタフェース([Jobs](#1-spark-jobsタブ)、[Stages](#2-stagesタブ)、[Tasks](#3-Tasks)、[Storage](#4-storageタブ)、[Environment](#5-environmentタブ)、[Executors](#6-executorsタブ)、[SQL](#7-sqlタブ))を提供しています。

SparkがどのようにSpark/PySparkのジョブを実行するのかをより理解するためには、これら一連のユーザーインタフェースが役立ちます。本書では、小さなアプリケーションを実行し、Spark Web UIのそれぞれのセクションを用いることで、どのようにSparkがこれを実行するのかを説明します。

Spark UIに入っていく前に、以下の2つのコンセプトを学びます。

- [Transformation](https://sparkbyexamples.com/apache-spark-rdd/spark-rdd-transformations/)
- [Action](https://sparkbyexamples.com/apache-spark-rdd/spark-rdd-actions/)

これら2つを簡単に説明させてください。あなたのアプリケーションコードは、Sparkジョブを実行するようにドライバーに指示を行う一連の命令であり、ドライバーはエグゼキューターの助けを借りて、どのようにこれを達成するのかを決定します。

ドライバーに対する指令はTransformationとActionと呼ばれ、処理を起動します。

トランスフォーメーションとアクションを行う小さなアプリケーションを記述しました。
![](https://i0.wp.com/sparkbyexamples.com/wp-content/uploads/2020/07/1.-Transformation-and-Action.jpg?resize=1024%2C251&ssl=1)
*アプリケーションコード*

ここでは、[csvファイルを読み込み](https://sparkbyexamples.com/apache-spark-rdd/spark-load-csv-file-into-rdd/)、[データフレームを作成](https://sparkbyexamples.com/spark/different-ways-to-create-a-spark-dataframe/)してから、データフレームの行数をカウントしています。アプリケーションがSpark UI上でどのように表示されているのかを学んでいきましょう。

Spark UIは以下のタブから構成されます。

1. Spark Jobs
1. Stages
1. Tasks
1. Storage
1. Environment
1. Executors
1. SQL

ローカルでSparkアプリケーションを実行している際、Spark UIは http://localhost:4040/ を用いることでアクセスすることができます。デフォルトではSpark UIはポート4040で動作し、Sparkアプリケーションをトラッキングするために幾つかの追加のUIが役に立ちます。
![](https://i2.wp.com/sparkbyexamples.com/wp-content/uploads/2020/07/2.Spark-UI-scaled.jpg?resize=768%2C432&ssl=1)
*Spark Web UI*

- Spark Application UI: http://localhost:4040/
- Resource Manager: http://localhost:9870
- Spark JobTracker: http://localhost:8088/
- Node Specific Info: http://localhost:8042/

> **注意**
これらのURLにアクセスするためには、Sparkアプリケーションが実行中の状態にある必要があります。Sparkアプリケーションの状態に関係なしにURLにアクセスし、常にSpark UIにアクセスしたい場合には、[Spark History server](https://sparkbyexamples.com/hadoop/spark-setup-on-yarn/#spark-history-server)を起動する必要があります。

# 1. Spark Jobsタブ

![](https://i2.wp.com/sparkbyexamples.com/wp-content/uploads/2020/07/4.Scheduling.jpg?w=550&ssl=1)
*Jobsタブ*

Jobsセクションで気づいていただきたい詳細な点は、[Scheduling mode](https://sparkbyexamples.com/spark/spark-web-ui-understanding/#scheduling)、[number of Spark Jobs](https://sparkbyexamples.com/spark/spark-web-ui-understanding/#Job)、[number of stages](https://sparkbyexamples.com/spark/spark-web-ui-understanding/#Stage)、およびSparkジョブの[number of stages](https://sparkbyexamples.com/spark/spark-web-ui-understanding/#Stage)です。

## 1.1 Scheduling mode(スケジューリングモード)

スケジューリングモードは3つあります。

1. **Standalone**モード
1. **YARN**モード
1. **Mesos**
![](https://i1.wp.com/sparkbyexamples.com/wp-content/uploads/2020/07/5.NumberofJobs-scaled.jpg?resize=768%2C143&ssl=1)
*Spark Schedulingタブ*

## 1.2 Number of Spark Jobs(Sparkジョブの数)

Sparkジョブの数はアプリケーションにおけるアクションの数と同じであり、Sparkジョブは少なくとも1つのステージが必要とすることを、常に頭に留めておく必要があります。上のアプリケーションでは、3つのSparkジョブが含まれています(0、1、2)。

- Job 0. *CSVファイルの読み込み*
- Job 1. *ファイルからのInferschema*
- Job 2. *Countのチェック*

上の図を見ると、3つのアクションから3つのSparkジョブが生成されていることが明らかに分かります。

## 1.3 Number of Stages(ステージの数)

それぞれの[Wide Transformation](https://sparkbyexamples.com/apache-spark-rdd/spark-rdd-transformations/#wider-transformation)は異なるNumber of Stagesを生み出します。我々のケースでは、Spark job0とSpark job1は個々のステージを持っていますが、Spark job3はデータのパーティションのため2つのステージが存在します。

## 1.4 Description(説明)

Descriptionには、関連づけられるSparkJobののステータス、DAGの可視化、完了したステージのような完全な詳細情報へのリンクを提供します。以降のパートで詳細を説明します。

# 2. Stagesタブ

![](https://i2.wp.com/sparkbyexamples.com/wp-content/uploads/2020/07/6.Stage-Tab-scaled.jpg?resize=1024%2C347&ssl=1)
*Sparkステージタブ*

2つの方法でStageタブにナビゲートすることができます。

1. それぞれのSparkジョブのDescriptionを選択します(選択されたSparkジョブに対応するステージのみを表示します)。
1. Sparkジョブタブの上でStagesオプションを選択します(アプリケーションの全てのステージを表示します)。

我々のアプリケーションでは、合計**4つのステージ**があります。

Stageタブには、SparkアプリケーションにおけるすべてのSparkジョブの全てのステージの現在の状態を表示するサマリーページが表示されます。

それぞれのステージで確認できるタスクの数は、スパークが処理を行うパーティションの数であり、ステージ内のそれぞれのタスクには、sparkによる同じ処理が含まれますが、異なるパーティションが対象となります。
![](https://i1.wp.com/sparkbyexamples.com/wp-content/uploads/2020/07/7.Stage0_.jpg?resize=620%2C1024&ssl=1)
*Stage 0*

## Stage detail(ステージ詳細)

ステージの詳細には、ステージのDirected Acyclic Graph (DAG)が表示され、頂点がRDDとデータフレームを表示し、エッジが適用されたオペレーションを表現しています。

ステージのオペレーションを分析しましょう。Stage0のオペレーションは、以下となっています。

1. FileScanRDD
1. MapPartitionsRDD

## FileScanRDD

FileScanはファイルからのデータの読み込みを表現します。PartitionedFiles(ファイルブロック)のカスタムRDDパーティションであるFilePartitionsが所定のものとなります。我々のシナリオにおいては、CSVファイルが読み込まれています。

## MapPartitionsRDD

マップパーティションのトランスフォーメーションを行う際、MapPartitionsRDDが作成されます。
![](https://i2.wp.com/sparkbyexamples.com/wp-content/uploads/2020/07/8.Stage1_.jpg?resize=452%2C1024&ssl=1)
*Stage 1*

Stage(1)のオペエレーションは以下のものとなります。

1. FileScanRDD
2. MapPartitionsRDD
3. SQLExecutionRDD

ファイルスキャンとMapPartitionsRDDは既に説明しました。SQLExecutionRDDを見ていきましょう。

## SQLExecutionRDD

SQLExecutionRDDは、単一の構造化クエリーの実行を共に構成する複数のSparkジョブを追跡する際に用いられるSparkプロパティです。
![](https://i1.wp.com/sparkbyexamples.com/wp-content/uploads/2020/07/9.Stage2_.jpg?resize=620%2C1024&ssl=1)
*Stage 2*

Stage(2)とStage(3)のオペレーションは以下から構成されます。

1. FileScanRDD
1. MapPartitionsRDD
1. WholeStageCodegen
2. Exchange

## Wholestagecodegen

複数の物理オペレーターを統合するSpark SQLにおける物理クエリーのオプティマイザーです。

## Exchange

COUNTメソッドによってExchangeが実行されます。データはパーティションに分割され、エグゼキューター間で共有され、個々のパーティションに対するカウントが累積されることでカウントの合計が計算されます。

これは、クラスター(エグゼキューター)におけるデータ移動であるシャッフルを表現します。もっとも高コストなオペレーションであり、パーティションの数が多くなると、エグゼキューター間のデータ交換もまた多くなります。

# 3. Tasks

タスクはそれぞれのステージの下部のスペースに位置付けられています。タスクページで注意すべきことは以下のことです。

1. Input Size – ストレージに対する入力です。
1. Shuffle Write - アウトプットはステージによる書き込みです。

# 4. Storageタブ

Storageタブには、アプリケーションで永続化されたRDDやデータフレームが表示されます。サマリーページには、全てのRDDのストレージのレベル、サイズ、パーティションが表示され、詳細ページにはRDD、データフレームにおける全てのパーティションに対するサイズと、アクセスしているエグゼキューターが表示されます。

# 5. Environmentタブ
![](https://i1.wp.com/sparkbyexamples.com/wp-content/uploads/2020/07/12.Env_.jpg?resize=1024%2C458&ssl=1)
*Spark Environmentタブ*

Environmentページには5つのパートがあります。ご自身のプロパティが適切に設定されているかどうかを確認するために役立ちます。

1. **Runtime Information:** シンプルにJava、Scalaのバージョンのようなランタイムプロパティが含まれます。
1. **Spark Properties:** lists the application properties like `spark.app.name`や`spark.driver.memory`のようなアプリケーションのプロパティの一覧を表示します。
1. **Hadoop Properties:** Hadoop、YARNに関係するプロパティの一覧を表示します。**注意:** `spark.hadoop`のようなプロパティはこのパートには表示されず`Spark Properties`に表示されます。
1. **System Properties:** JVMに関する詳細情報を表示します。
1. **Classpath Entries:** 様々なソースからロードされるクラスの一覧を表示し、クラスの競合を解決する際に役立ちます。
![](https://i1.wp.com/sparkbyexamples.com/wp-content/uploads/2020/07/13.Env_-scaled.jpg?resize=1536%2C889&ssl=1)
*Spark Environmentプロパティ*

Environmentタブには、JVM、Spark、システムプロパティなど様々な環境変数、設定値が表示されます。

# 6. Executorsタブ

![](https://i2.wp.com/sparkbyexamples.com/wp-content/uploads/2020/07/14.Executors-scaled.jpg?resize=1024%2C359&ssl=1)
*Spark Executorsタブ*

Executorsタブには、アプリケーション向けに生成されたエグゼキューターに関する、メモリー、ディスク使用料、タスク、シャッフル情報などのサマリー情報が表示されます。Storage Memoryカラムには使用されたメモリー、データキャッシュのために確保されたメモリーの量が表示されます。

Executorsタブには、個々のエグゼキューターによって使用されているメモリー、ディスク、コアのようなリソース情報のみではなく、パフォーマンスに関する情報も表示されます。

Executoreには、`Number of cores = 3`と表示されており、3スレッドとlocalを指定しているので、`Number of tasks = 4`となります。

# 7. SQLタブ
![](https://i0.wp.com/sparkbyexamples.com/wp-content/uploads/2020/07/15.SQLTAb-scaled.jpg?resize=1024%2C227&ssl=1)
*Spark SQLタブ*

アプリケーションがSpark SQLクエリーを実行する際、SQLタブには時間、Sparkジョブ、クエリーに対する物理プラン、論理プランのような情報が表示されます。

我々のアプリケーションでは、ファイルとデータフレームに対する読み込み、カウントを実行しました。readとcountがSQLタブに表示されます。

いくつかのリソースは https://spark.apache.org/ に格納されています。

"……………学び続け、成長し続けましょう……………"

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)