

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

# 使用監控組態來監控 Spark Kubernetes 運算子和 Spark 任務
<a name="spark-operator-monitoring-configuration"></a>

監控組態可讓您輕鬆地將 Spark 應用程式和運算子日誌的日誌封存設定到 Amazon S3 或 Amazon CloudWatch。您可以選擇其中一個或兩者。這樣做會將日誌代理程式附屬項目新增至您的 Spark 運算子 Pod、驅動程式和執行器 Pod，然後將這些元件的日誌轉送到您設定的接收器。

## 先決條件
<a name="spark-operator-monitoring-configuration-prereqs"></a>

設定監控之前，請務必完成下列設定任務：

1. （選用） 如果您先前已安裝較舊版本的 Spark 運算子，請刪除 *SparkApplication/ScheduledSparkApplication* CRD。

   ```
   kubectl delete crd scheduledsparkapplications.sparkoperator.k8s.io
   kubectl delete crd sparkapplications.sparkoperator.k8s.io
   ```

1. 如果您還沒有運算子/任務執行角色，請在 IAM 中建立該角色。

1. 執行下列命令來更新您剛建立之運算子/任務執行角色的信任政策：

   ```
   aws emr-containers update-role-trust-policy \ 
   --cluster-name cluster \
   --namespace namespace \
   --role-name iam_role_name_for_operator/job_execution_role
   ```

1. 將運算子/任務執行角色的 IAM 角色信任政策編輯如下：

   ```
   {
       "Effect": "Allow",
       "Principal": {
           "Federated": "${OIDC-provider}"
       },
       "Action": "sts:AssumeRoleWithWebIdentity",
       "Condition": {
           "StringLike": {
               "OIDC_PROVIDER:sub": "system:serviceaccount:${Namespace}:emr-containers-sa-*"
           }
       }
   }
   ```

1. 在具有下列許可的 IAM 中建立 *monitoringConfiguration* 政策：

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "logs:DescribeLogStreams",
           "logs:CreateLogStream",
           "logs:CreateLogGroup",
           "logs:PutLogEvents"
         ],
         "Resource": [
           "arn:aws:logs:*:*:log-group:log_group_name",
           "arn:aws:logs:*:*:log-group:log_group_name:*"
         ],
         "Sid": "AllowLOGSDescribelogstreams"
       },
       {
         "Effect": "Allow",
         "Action": [
           "logs:DescribeLogGroups"
         ],
         "Resource": [
           "*"
         ],
         "Sid": "AllowLOGSDescribeloggroups"
       },
       {
         "Effect": "Allow",
         "Action": [
           "s3:PutObject",
           "s3:GetObject",
           "s3:ListBucket"
         ],
         "Resource": [
           "arn:aws:s3:::bucket_name",
           "arn:aws:s3:::bucket_name/*"
         ],
         "Sid": "AllowS3Putobject"
       }
     ]
   }
   ```

------

1. 將上述政策連接至您的運算子/任務執行角色。

# Spark 運算子日誌
<a name="spark-operator-monitoring-configuration-logs"></a>

您可以在執行 時，以下列方式定義監控組態`helm install`：

```
helm install spark-operator spark-operator \
--namespace namespace \
--set emrContainers.awsRegion=aws_region \
--set emrContainers.monitoringConfiguration.image=log_agent_image_url \
--set emrContainers.monitoringConfiguration.s3MonitoringConfiguration.logUri=S3_bucket_uri \
--set emrContainers.monitoringConfiguration.cloudWatchMonitoringConfiguration.logGroupName=log_group_name \
--set emrContainers.monitoringConfiguration.cloudWatchMonitoringConfiguration.logStreamNamePrefix=log_stream_prefix \
--set emrContainers.monitoringConfiguration.sideCarResources.limits.cpuLimit=500m \
--set emrContainers.monitoringConfiguration.sideCarResources.limits.memoryLimit=512Mi \
--set emrContainers.monitoringConfiguration.containerLogRotationConfiguration.rotationSize=2GB \
--set emrContainers.monitoringConfiguration.containerLogRotationConfiguration.maxFilesToKeep=10 \
--set webhook.enable=true \
--set emrContainers.operatorExecutionRoleArn=operator_execution_role_arn
```

**監控組態**

以下是 **monitoringConfiguration** 下的可用組態選項。
+ **映像 ** （選用） – 日誌代理程式映像 URL。如果未提供， 將依 emrReleaseLabel 擷取。
+ **s3MonitoringConfiguration** – 將此選項設定為封存至 Amazon S3。
  + **logUri** – （必要） – 您要存放日誌的 Amazon S3 儲存貯體路徑。
  + 以下是上傳日誌後 Amazon S3 儲存貯體路徑的範例格式。第一個範例顯示未啟用日誌輪換。

    ```
    s3://${logUri}/${POD NAME}/operator/stdout.gz
    s3://${logUri}/${POD NAME}/operator/stderr.gz
    ```

    預設啟用日誌輪換。您可以同時看到具有遞增索引的輪換檔案，以及與先前範例相同的目前檔案。

    ```
    s3://${logUri}/${POD NAME}/operator/stdout_YYYYMMDD_index.gz
    s3://${logUri}/${POD NAME}/operator/stderr_YYYYMMDD_index.gz
    ```
+ **cloudWatchMonitoringConfiguration** – 要設定轉送的組態金鑰 Amazon CloudWatch。
  + **logGroupName** （必要） – 您要傳送 Amazon CloudWatch 日誌的日誌群組名稱。如果群組不存在，則會自動建立群組。
  + **logStreamNamePrefix** （選用） – 您要將日誌傳送到其中的日誌串流名稱。預設值為空字串。中的格式 Amazon CloudWatch 如下：

    ```
    ${logStreamNamePrefix}/${POD NAME}/STDOUT or STDERR
    ```
+ **sideCarResources** （選用） – 設定已啟動 Fluentd 附屬容器資源限制的組態金鑰。
  + **memoryLimit** （選用） – 記憶體限制。根據需要進行調整。預設值為 512Mi。
  + **cpuLimit** （選用） – CPU 限制。根據需要進行調整。預設值為 500 公尺。
+ **containerLogRotationConfiguration** （選用） – 控制容器日誌輪換行為。依預設會啟用此功能。
  + **rotationSize** （必要） – 指定日誌輪換的檔案大小。可能的值範圍為 2KB 至 2GB。rotationSize 參數的數值單位部分會以整數形式傳遞。由於不支援小數值，因此可以使用值 1500MB 來指定 1.5GB 的輪換大小。預設值為 2GB。
  + **maxFilesToKeep** （必要） – 指定輪換發生後要在容器中保留的檔案數量上限。下限值是 1，上限值是 50。預設為 10。

設定 *monitoringConfiguration* 之後，您應該能夠檢查 Amazon S3 儲存貯體 Amazon CloudWatch 或 或兩者上的 Spark Operator Pod 日誌。對於 Amazon S3 儲存貯體，您需要等待 2 分鐘，第一個日誌檔案才能排清。

若要尋找 中的日誌 Amazon CloudWatch，您可以導覽至下列項目：**CloudWatch** > **日誌群組** > ***日誌群組名稱*** > *Pod 名稱***/操作員/stderr**

或者，您可以導覽至：**CloudWatch** > **日誌群組** > ***日誌群組名稱*** > *Pod 名稱***/操作員/stdout**

# Spark 應用程式日誌
<a name="spark-operator-monitoring-application-logs"></a>

可採用以下方法定義此設定。

```
apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
  name: spark-pi
  namespace: namespace
spec:
  type: Scala
  mode: cluster
  imagePullPolicy: Always
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: "local:///usr/lib/spark/examples/jars/spark-examples.jar"
  sparkVersion: "3.3.1"
  emrReleaseLabel: emr_release_label
  executionRoleArn: job_execution_role_arn
  restartPolicy:
    type: Never
  volumes:
    - name: "test-volume"
      hostPath:
        path: "/tmp"
        type: Directory
  driver:
    cores: 1
    coreLimit: "1200m"
    memory: "512m"
    labels:
      version: 3.3.1
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"
  executor:
    cores: 1
    instances: 1
    memory: "512m"
    labels:
      version: 3.3.1
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"
  monitoringConfiguration:
    image: "log_agent_image"
    s3MonitoringConfiguration:
      logUri: "S3_bucket_uri"
    cloudWatchMonitoringConfiguration:
      logGroupName: "log_group_name"
      logStreamNamePrefix: "log_stream_prefix"
    sideCarResources:
      limits:
        cpuLimit: "500m"
        memoryLimit: "250Mi"
    containerLogRotationConfiguration:
      rotationSize: "2GB"
      maxFilesToKeep: "10"
```

以下是 **monitoringConfiguration** 下的可用組態選項。
+ **映像** （選用） – 日誌代理程式映像 URL。如果未提供， 將依 emrReleaseLabel 擷取。
+ **s3MonitoringConfiguration** – 將此選項設定為封存至 Amazon S3。
  + **logUri** （必要） – 您要存放日誌的 Amazon S3 儲存貯體路徑。第一個範例顯示未啟用日誌輪換：

    ```
    s3://${logUri}/${APPLICATION NAME}-${APPLICATION UID}/${POD NAME}/stdout.gz
    s3://${logUri}/${APPLICATION NAME}-${APPLICATION UID}/${POD NAME}/stderr.gz
    ```

    日誌輪換預設為啟用。您可以同時使用輪換的檔案 （含遞增索引） 和目前的檔案 （不含日期戳記的檔案）。

    ```
    s3://${logUri}/${APPLICATION NAME}-${APPLICATION UID}/${POD NAME}/stdout_YYYYMMDD_index.gz
    s3://${logUri}/${APPLICATION NAME}-${APPLICATION UID}/${POD NAME}/stderr_YYYYMMDD_index.gz
    ```
+ **cloudWatchMonitoringConfiguration** – 要設定轉送的組態金鑰 Amazon CloudWatch。
  + **logGroupName** （必要） – 您要傳送日誌的 Cloudwatch 日誌群組名稱。如果群組不存在，則會自動建立該群組。
  + **logStreamNamePrefix** （選用） – 您要將日誌傳送到其中的日誌串流名稱。預設值為空字串。CloudWatch 的格式如下所示：

    ```
    ${logStreamNamePrefix}/${APPLICATION NAME}-${APPLICATION UID}/${POD NAME}/stdout
    ${logStreamNamePrefix}/${APPLICATION NAME}-${APPLICATION UID}/${POD NAME}/stderr
    ```
+ **sideCarResources** （選用） – 設定已啟動 Fluentd 附屬容器資源限制的組態金鑰。
  + **memoryLimit** （選用） – 記憶體限制。根據需要進行調整。預設值為 250Mi。
  + **cpuLimit** – CPU 限制。根據需要進行調整。預設值為 500 公尺。
+ **containerLogRotationConfiguration** （選用） – 控制容器日誌輪換行為。依預設會啟用此功能。
  + **rotationSize** （必要） – 指定日誌輪換的檔案大小。可能的值範圍為 2KB 至 2GB。rotationSize 參數的數值單位部分會以整數形式傳遞。由於不支援小數值，因此可以使用值 1500MB 來指定 1.5GB 的輪換大小。預設值為 2GB。
  + **maxFilesToKeep** （必要） – 指定輪換發生後要在容器中保留的檔案數量上限。最小值為 1。最大值為 50。預設為 10。

設定 monitoringConfiguration 之後，您應該能夠在 Amazon S3 儲存貯體或 CloudWatch 或兩者上檢查 Spark 應用程式驅動程式和執行器日誌。對於 Amazon S3 儲存貯體，您需要等待 2 分鐘才能排清第一個日誌檔案。例如，在 Amazon S3 中，儲存貯體路徑如下所示：

**Amazon S3** > **儲存貯體** > ***儲存貯體名稱*** > *Spark 應用程式名稱 - UUID* > *Pod 名稱* > **stderr.gz**

或者：

**Amazon S3** > **儲存貯體** > ***儲存貯體名稱*** > *Spark 應用程式名稱 - UUID* > *Pod 名稱* > **stdout.gz**

在 CloudWatch 中，路徑如下所示：

**CloudWatch** > **日誌群組** > ***日誌群組名稱*** > *Spark 應用程式名稱 - UUID*/*Pod 名稱***/stderr**

或者：

**CloudWatch** > **日誌群組** > ***日誌群組名稱*** > *Spark 應用程式名稱 - UUID*/*Pod 名稱***/stdout**