

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Apache Spark web UI 監控任務
<a name="monitor-spark-ui"></a>

您可以使用 Apache Spark Web UI 來監控和偵錯在 AWS Glue 任務系統上執行的 AWS Glue ETL 任務，以及在 AWS Glue 開發端點上執行的 Spark 應用程式。Spark UI 可讓您為每個任務檢查下列項目：
+ 每個 Spark 階段的事件時間軸
+ 任務的有向無環圖 (DAG)
+ SparkSQL 查詢的實體和邏輯計畫
+ 每個任務的基礎 Spark 環境變數

如需有關使用 Spark Web UI 的詳細資訊，請參閱《Spark 文件》中的 [Web UI](https://spark.apache.org/docs/3.3.0/web-ui.html)。如需如何解譯 Spark UI 結果以改善任務效能的指引，請參閱 AWS 方案指南中 [AWS Glue Apache Spark 任務效能調校的最佳實務](https://docs.aws.amazon.com/prescriptive-guidance/latest/tuning-aws-glue-for-apache-spark/introduction.html)。

 您可以在 AWS Glue 主控台中查看 Spark UI。當 AWS Glue 任務以標準 （而非舊版） 格式產生的日誌在 AWS Glue 3.0 或更新版本上執行時，即可使用此功能，這是較新任務的預設值。如果您的日誌檔案大於 0.5 GB，您可以為在 AWS Glue 4.0 或更新版本上執行的任務啟用滾動日誌支援，以簡化日誌封存、分析和故障診斷。

您可以使用 AWS Glue主控台或 AWS Command Line Interface () 啟用 Spark UI AWS CLI。當您啟用 Spark UI 時，AWS Glue 開發端點上的 AWS Glue ETL 任務和 Spark 應用程式可以將 Spark 事件日誌備份到您在 Amazon Simple Storage Service (Amazon S3) 中指定的位置。可搭配使用 Amazon S3 中已備份的事件日誌與 Spark UI，即可在工作運作時即時使用，也可在工作完成後使用。當日誌保留在 Amazon S3 中時， AWS Glue 主控台中的 Spark UI 可以檢視它們。

## 許可
<a name="monitor-spark-ui-limitations-permissions"></a>

 若要在 AWS Glue 主控台中使用 Spark UI，您可以使用`UseGlueStudio`或新增所有個別服務 APIs。所有 API 都需要完全使用 Spark UI，但使用者可以在 IAM 許可中新增其服務 API 來存取 SparkUI 功能，以進行精細存取。

 `RequestLogParsing` 最為重要，因為其會執行日誌剖析。其餘 API 用於讀取各自的剖析資料。例如，`GetStages` 可讓您存取 Spark 任務所有階段的資料。

 映射到 `UseGlueStudio` 的 Spark UI 服務 API 清單如以下範例政策中所示。下面的政策提供僅限使用 Spark UI 功能的存取權。若要新增更多許可，例如 Amazon S3 和 IAM，請參閱[為 建立自訂 IAM 政策 AWS Glue Studio。 ](https://docs.aws.amazon.com/glue/latest/dg/getting-started-min-privs.html#getting-started-all-gs-privs.html)

 映射到 `UseGlueStudio` 的 Spark UI 服務 API 清單如以下範例政策中所示。使用 Spark UI 服務 API 時，請使用下列命名空間：`glue:<ServiceAPI>`。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowGlueStudioSparkUI",
      "Effect": "Allow",
      "Action": [
        "glue:RequestLogParsing",
        "glue:GetLogParsingStatus",
        "glue:GetEnvironment",
        "glue:GetJobs",
        "glue:GetJob",
        "glue:GetStage",
        "glue:GetStages",
        "glue:GetStageFiles",
        "glue:BatchGetStageFiles",
        "glue:GetStageAttempt",
        "glue:GetStageAttemptTaskList",
        "glue:GetStageAttemptTaskSummary",
        "glue:GetExecutors",
        "glue:GetExecutorsThreads",
        "glue:GetStorage",
        "glue:GetStorageUnit",
        "glue:GetQueries",
        "glue:GetQuery"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```

------

## 限制
<a name="monitor-spark-ui-limitations"></a>
+  AWS Glue 主控台中的 Spark UI 不適用於 2023 年 11 月 20 日之前發生的任務執行，因為它們是舊版日誌格式。
+  AWS Glue 主控台中的 Spark UI 支援滾動日誌 for AWS Glue 4.0，例如串流任務中預設產生的日誌。所有產生的滾動日誌事件檔案總和上限為 2 GB。對於沒有滾動日誌支援 AWS Glue 的任務，SparkUI 支援的日誌事件檔案大小上限為 0.5 GB。
+  對於只能由您的 VPC 存取的 Amazon S3 儲存貯體中存放的 Spark 事件日誌，Serverless Spark UI 不適用。

## 範例：Apache Spark Web UI
<a name="monitor-spark-ui-limitations-example"></a>

此範例顯示如何使用 Spark UI 了解工作效能。螢幕擷取畫面顯示自我管理的 Spark 歷史記錄伺服器提供的 Spark Web UI。 AWS Glue 主控台中的 Spark UI 提供類似的檢視。如需有關使用 Spark Web UI 的詳細資訊，請參閱《Spark 文件》中的 [Web UI](https://spark.apache.org/docs/3.3.0/web-ui.html)。

以下是 Spark 應用程式的範例，它會讀取兩個資料來源、執行聯結轉換，然後以 Parquet 格式將其寫入至 Amazon S3。

```
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from pyspark.sql.functions import count, when, expr, col, sum, isnull
from pyspark.sql.functions import countDistinct
from awsglue.dynamicframe import DynamicFrame
 
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
 
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
 
job = Job(glueContext)
job.init(args['JOB_NAME'])
 
df_persons = spark.read.json("s3://awsglue-datasets/examples/us-legislators/all/persons.json")
df_memberships = spark.read.json("s3://awsglue-datasets/examples/us-legislators/all/memberships.json")
 
df_joined = df_persons.join(df_memberships, df_persons.id == df_memberships.person_id, 'fullouter')
df_joined.write.parquet("s3://aws-glue-demo-sparkui/output/")
 
job.commit()
```

下列 DAG 視覺化顯示此 Spark 任務中的不同階段。

![\[Spark UI 的螢幕擷取畫面顯示任務 0 的 2 個已完成階段。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/spark-ui1.png)


下列任務的事件時間軸顯示不同 Spark 執行器的啟動、執行和終止。

![\[Spark UI 的螢幕擷取畫面顯示不同 Spark 執行器的完成、失敗和作用中階段。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/spark-ui2.png)


下列畫面顯示 SparkSQL 查詢計畫的詳細資訊：
+ 已剖析的邏輯計畫
+ 已分析的邏輯計畫
+ 已最佳化的邏輯計畫
+ 要執行的實體計畫

![\[SparkSQL 查詢計畫：已剖析、已分析和已最佳化的邏輯計畫，以及要執行的實體計畫。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/spark-ui3.png)


**Topics**
+ [許可](#monitor-spark-ui-limitations-permissions)
+ [限制](#monitor-spark-ui-limitations)
+ [範例：Apache Spark Web UI](#monitor-spark-ui-limitations-example)
+ [為 AWS Glue 任務啟用 Apache Spark web UI](monitor-spark-ui-jobs.md)
+ [啟動 Spark 歷史記錄伺服器](monitor-spark-ui-history.md)

# 為 AWS Glue 任務啟用 Apache Spark web UI
<a name="monitor-spark-ui-jobs"></a>

您可以使用 Apache Spark Web UI 來監控和偵錯在 AWS Glue 任務系統上執行的 AWS Glue ETL 任務。您可以使用 AWS Glue 主控台或 AWS Command Line Interface (AWS CLI) 來設定 Spark UI。

每 30 秒，AWS Glue 會將 Spark 事件日誌備份至您指定的 Amazon S3 路徑。

**Topics**
+ [設定 Spark UI (主控台)](#monitor-spark-ui-jobs-console)
+ [設定 Spark UI (AWS CLI)](#monitor-spark-ui-jobs-cli)
+ [使用筆記本為工作階段設定 Spark UI](#monitor-spark-ui-sessions)
+ [啟用滾動日誌](#monitor-spark-ui-rolling-logs)

## 設定 Spark UI (主控台)
<a name="monitor-spark-ui-jobs-console"></a>

使用 AWS 管理主控台，依照以下步驟來設定 Spark UI。建立 AWS Glue 任務時，預設會啟用 Spark UI。

**建立或編輯工作時開啟 Spark UI**

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue主控台。

1. 在導覽窗格中，選擇 **Jobs (任務)**。

1. 選擇**新增任務**，或選取現有任務。

1. 在**任務詳細資料**中，開啟**進階屬性**。

1. 在 **Spark UI** 索引標籤下方，選擇將 **Spark UI 日誌寫入 Amazon S3**。

1. 指定 Amazon S3 路徑以用於存放任務的 Spark 事件日誌。請注意，如果在工作中使用安全組態，加密也會套用至 Spark UI 日誌檔案。如需詳細資訊，請參閱[加密 寫入的資料 AWS Glue](encryption-security-configuration.md)。

1. 在 **Spark UI 記錄和監控組態**下方：
   + 如果您要在 AWS Glue 主控台中產生要檢視的日誌，請選取**標準**。
   + 如果要產生日誌以在 Spark 歷史記錄伺服器中檢視，請選取**舊版**。
   + 您也可以選擇產生兩者。

## 設定 Spark UI (AWS CLI)
<a name="monitor-spark-ui-jobs-cli"></a>

若要產生使用 Spark UI 檢視的日誌，請在 AWS Glue 主控台中使用 AWS CLI 將下列任務參數傳遞給AWS Glue任務。如需詳細資訊，請參閱[在 Glue AWS 任務中使用任務參數](aws-glue-programming-etl-glue-arguments.md)。

```
'--enable-spark-ui': 'true',
'--spark-event-logs-path': 's3://s3-event-log-path'
```

若要將日誌分發至其舊版位置，請將 `--enable-spark-ui-legacy-path` 參數設定為 `"true"`。如果您不想要產生這兩種格式的日誌，請移除 `--enable-spark-ui` 參數。

## 使用筆記本為工作階段設定 Spark UI
<a name="monitor-spark-ui-sessions"></a>

**警告**  
AWS Glue 互動式工作階段目前不支援主控台中的 Spark UI。設定 Spark 歷史記錄伺服器。

 如果您使用 AWS Glue 筆記本，請在開始工作階段之前設定 SparkUI 組態。為此，請使用 `%%configure` 儲存格魔術命令：

```
%%configure { “--enable-spark-ui”: “true”, “--spark-event-logs-path”: “s3://path” }
```

## 啟用滾動日誌
<a name="monitor-spark-ui-rolling-logs"></a>

 為 AWS Glue 任務啟用 SparkUI 和滾動日誌事件檔案有幾個優點：
+  滾動日誌事件檔案 – 啟用滾動日誌事件檔案後， 會針對任務執行的每個步驟 AWS Glue 產生個別日誌檔案，讓您更輕鬆地識別特定階段或轉換的特定問題並進行疑難排解。
+  更好的日誌管理 – 滾動日誌事件檔案有助於更有效率地管理日誌檔案。日誌不是單一但可能很大的日誌檔案，而是會根據任務執行階段分區成更小、更易於管理的檔案。這可以簡化日誌封存、分析和故障診斷。
+  改善容錯能力 – 如果 AWS Glue 任務失敗或中斷，滾動日誌事件檔案可以提供有關最後一個成功階段的寶貴資訊，讓您更輕鬆地從該點繼續任務，而不是從頭開始。
+  成本最佳化 – 透過啟用滾動日誌事件檔案，可以節省與日誌檔案相關聯的儲存成本。您可以儲存更小、更易於管理的日誌檔案，而非儲存單一、可能很大的日誌檔案，這可能更具成本效益，尤其對於長時間執行或複雜任務。

 在新環境中，使用者可以透過以下方法明確啟用滾動日誌：

```
'—conf': 'spark.eventLog.rolling.enabled=true'
```

或

```
'—conf': 'spark.eventLog.rolling.enabled=true —conf 
spark.eventLog.rolling.maxFileSize=128m'
```

 啟動滾動日誌時，`spark.eventLog.rolling.maxFileSize` 會指定事件日誌檔案的大小上限，然後再滾動。如果未指定此可選參數，其會預設為 128 MB。最小值為 10 MB。

 所有產生的滾動日誌事件檔案總和上限為 2 GB。對於沒有滾動日誌支援 AWS Glue 的任務，SparkUI 支援的日誌事件檔案大小上限為 0.5 GB。

可以透過傳遞其他組態來關閉串流工作的滾動日誌。請注意，非常大的日誌檔案可能需要昂貴的維護成本。

若要關閉滾動日誌，請提供下列組態：

```
'--spark-ui-event-logs-path': 'true',
'--conf': 'spark.eventLog.rolling.enabled=false'
```

# 啟動 Spark 歷史記錄伺服器
<a name="monitor-spark-ui-history"></a>

可使用 Spark 歷史記錄伺服器，在您自己的基礎設施中視覺化 Spark 日誌。您可以在 AWS Glue 主控台中看到在 AWS Glue 4.0 或更新版本上執行 AWS Glue 任務的相同視覺效果，其中包含以標準 （而非舊版） 格式產生的日誌。如需詳細資訊，請參閱[使用 Apache Spark web UI 監控任務](monitor-spark-ui.md)。

您可以使用在 EC2 執行個體上託管伺服器的 AWS CloudFormation 範本來啟動 Spark 歷史記錄伺服器，或使用 Docker 在本機啟動。

**Topics**
+ [使用 啟動 Spark 歷史記錄伺服器並檢視 Spark UI AWS CloudFormation](#monitor-spark-ui-history-cfn)
+ [啟動 Spark 歷史記錄伺服器並使用 Docker 檢視 Spark UI](#monitor-spark-ui-history-local)

## 使用 啟動 Spark 歷史記錄伺服器並檢視 Spark UI AWS CloudFormation
<a name="monitor-spark-ui-history-cfn"></a>

您可以使用 AWS CloudFormation 範本來啟動 Apache Spark 歷史記錄伺服器，並檢視 Spark Web UI。這些範本是範例，您應加以修改以符合您的需求。

**使用 啟動 Spark 歷史記錄伺服器並檢視 Spark UI CloudFormation**

1. 選擇下表中的其中一個 **Launch Stack (啟動堆疊)** 按鈕。這會在 CloudFormation 主控台上啟動堆疊。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitor-spark-ui-history.html)

1. 在 **Specify template (指定範本)** 頁面上，選擇 **Next (下一步)**。

1. 在 **Specify stack details (指定堆疊詳細資訊)** 頁面上，輸入 **Stack name (堆疊名稱)**。在 **Parameters** (參數) 下輸入其他資訊。

   1. 

**Spark UI 組態**

      請提供下列資訊：
      + **IP address range (IP 地址範圍)** - 可用於檢視 Spark UI 的 IP 地址範圍。如果您想要限制來自特定 IP 地址範圍的存取，您應該使用自訂值。
      + **History server port (歷史記錄伺服器連接埠)** - Spark UI 的連接埠。您可以使用預設值。
      + **Event log directory (事件日誌目錄)** - 選擇從 AWS Glue 任務或開發端點存放 Spark 事件日誌的位置。您必須使用 **s3a://** 做為事件日誌路徑配置。
      + **Spark package location (Spark 套件位置)** - 您可以使用預設值。
      + **Keystore path (金鑰存放區路徑)** - HTTPS 的 SSL/TLS 金鑰存放區路徑。如果您要使用自訂金鑰存放區檔案，可以在此指定 S3 路徑 `s3://path_to_your_keystore_file`。如果您將此參數保留空白，將會產生並使用以自我簽署憑證為基礎的金鑰存放區。
      + **Keystore password** (金鑰存放區密碼) – 輸入 HTTPS 的 SSL/TLS 金鑰存放區密碼。

   1. 

**EC2 執行個體組態**

      請提供下列資訊：
      + **Instance type (執行個體類型)** - 託管 Spark 歷史記錄伺服器的 Amazon EC2 執行個體類型。由於此範本啟動您帳戶中的 Amazon EC2 執行個體，因此會另外向您的帳戶收取 Amazon EC2 費用。
      + **Latest AMI ID (最新的 AMI ID)** - Spark 歷史記錄伺服器執行個體之 Amazon Linux 2 的 AMI ID。您可以使用預設值。
      + **VPC ID ** - Spark 歷史記錄伺服器執行個體的 Virtual Private Cloud (VPC) ID。您可以使用您帳戶中可用的任何 VPC，不建議使用預設 VPC 搭配[預設網路 ACL](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html#default-network-acl)。如需詳細資訊，請參閱 *Amazon VPC 使用者指南*中的[預設 VPC 和預設子網路](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html)以及[建立 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#Create-VPC)。
      + **Subnet ID (子網路 ID)** - Spark 歷史記錄伺服器執行個體的 ID。您可以使用 VPC 中的任何子網路。您必須能夠從用戶端連線到網路以連接至子網路。如果您要透過網際網路存取，必須使用在路由表中具有網際網路閘道的公有子網路。

   1. 選擇**下一步**。

1. 在 **Configure stack options** (設定堆疊選項) 頁面上，若要使用目前使用者憑證來決定 CloudFormation 如何在堆疊中建立、修改或刪除資源，請選擇 **Next** (下一步)。您也可以在**許可**區段指定一個角色，而非使用目前使用者的許可，然後選擇**下一步**。

1. 在 **Review (檢閱)** 頁面上檢閱範本。

   選取**我確認 CloudFormation 可能會建立 IAM 資源**，然後選擇**建立堆疊**。

1. 等待堆疊建立。

1. 開啟 **Outputs (輸出)** 標籤。

   1. 如果您使用公有子網路，請複製 **SparkUiPublicUrl** 的 URL。

   1. 如果您使用私有子網路 , 請複製 **SparkUiPrivateUrl** 的 URL。

1. 開啟 Web 瀏覽器，然後貼入該 URL。這可讓您使用 HTTPS 在指定連接埠上存取伺服器。您的瀏覽器可能會無法辨識伺服器的憑證，在此情況下，您必須覆寫其保護並繼續。

## 啟動 Spark 歷史記錄伺服器並使用 Docker 檢視 Spark UI
<a name="monitor-spark-ui-history-local"></a>

如果您偏好本機存取 (不使用 EC2 執行個體做為 Apache Spark 歷史記錄伺服器)，您也可以使用 Docker 來啟動 Apache Spark 歷史記錄伺服器，並在本機檢視 Spark UI。此 Dockerfile 為範例，您應該修改以符合您的需求。

 **先決條件** 

如需有關如何在筆記型電腦上安裝 Docker 的資訊，請參閱 [Docker 引擎社群](https://docs.docker.com/install/)。

**啟動 Spark 歷史記錄伺服器並使用 Docker 在本機檢視 Spark UI**

1. 從 GitHub 下載檔案。

   從 [ AWS Glue 程式碼範例](https://github.com/aws-samples/aws-glue-samples/tree/master/utilities/Spark_UI/)下載 Dockerfile 和 `pom.xml`。

1. 決定是否要使用您的使用者憑證或聯合身分使用者憑證來存取 AWS。
   + 若要使用目前的使用者登入資料進行存取 AWS，請在 `docker run`命令`AWS_SECRET_ACCESS_KEY`中取得要用於 ` AWS_ACCESS_KEY_ID`和 的值。如需詳細資訊，請參閱《 IAM 使用者指南》**中的[管理 IAM 使用者的存取金鑰](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)。
   + 若要使用 SAML 2.0 聯合身分使用者存取 AWS，請取得 ` AWS_ACCESS_KEY_ID`、 `AWS_SECRET_ACCESS_KEY`和 的值` AWS_SESSION_TOKEN`。如需詳細資訊，請參閱[請求暫時安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html)。

1. 判斷您的事件日誌目錄的位置，以在 `docker run` 命令中使用。

1. 使用本機目錄中的檔案建置 Docker 映像檔，對其使用名稱 ` glue/sparkui` 以及標籤 `latest`。

   ```
   $ docker build -t glue/sparkui:latest . 
   ```

1. 建立並啟動 Docker 容器。

   在下列命令中，使用先前在步驟 2 與 3 中取得的值。

   1. 若要使用您的使用者憑證建立 Docker 容器，請使用類似如下的命令。

      ```
      docker run -itd -e SPARK_HISTORY_OPTS="$SPARK_HISTORY_OPTS -Dspark.history.fs.logDirectory=s3a://path_to_eventlog
       -Dspark.hadoop.fs.s3a.access.key=AWS_ACCESS_KEY_ID -Dspark.hadoop.fs.s3a.secret.key=AWS_SECRET_ACCESS_KEY"
       -p 18080:18080 glue/sparkui:latest "/opt/spark/bin/spark-class org.apache.spark.deploy.history.HistoryServer"
      ```

   1. 要使用暫時憑證建立 Docker 容器，請使用 ` org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider` 做為提供者，並提供在步驟 2 中取得的憑證值。如需詳細資訊，請參閱 *Hadoop：與 Amazon Web Services 整合*文件中的[將工作階段憑證與 TemporaryAWSCredentialsProvider 搭配使用](https://hadoop.apache.org/docs/stable/hadoop-aws/tools/hadoop-aws/index.html#Using_Session_Credentials_with_TemporaryAWSCredentialsProvider)。

      ```
      docker run -itd -e SPARK_HISTORY_OPTS="$SPARK_HISTORY_OPTS -Dspark.history.fs.logDirectory=s3a://path_to_eventlog
       -Dspark.hadoop.fs.s3a.access.key=AWS_ACCESS_KEY_ID -Dspark.hadoop.fs.s3a.secret.key=AWS_SECRET_ACCESS_KEY
       -Dspark.hadoop.fs.s3a.session.token=AWS_SESSION_TOKEN
       -Dspark.hadoop.fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider"
       -p 18080:18080 glue/sparkui:latest "/opt/spark/bin/spark-class org.apache.spark.deploy.history.HistoryServer"
      ```
**注意**  
這些組態參數來自 [ Hadoop-AWS 模組](https://hadoop.apache.org/docs/stable/hadoop-aws/tools/hadoop-aws/index.html)。您可能需要根據您的使用案例來新增具體的組態。例如：隔離區域中的使用者需要設定 ` spark.hadoop.fs.s3a.endpoint`。

1. 在瀏覽器中開啟 `http://localhost:18080` 以在本機檢視 Spark UI。