

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用监控配置监控 Spark Kubernetes Operator 和 Spark 作业
<a name="spark-operator-monitoring-configuration"></a>

监控配置使您可以轻松地设置将 Spark 应用程序和 Operator 日志归档到 Amazon S3 或 Amazon CloudWatch。您可以选择其中一项或两项。这样做会将日志代理 sidecar 添加到 Spark Operator 容器组、驱动程序和执行程序容器组，随后将这些组件的日志转发到您配置的接收器。

## 先决条件
<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. 如果您还没有 operator/job 执行角色，请在 IAM 中创建执行角色。

1. 运行以下命令更新您刚刚创建的 operator/job 执行角色的信任策略：

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

1. 将您的 operator/job 执行角色的 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. 将上述策略附加到您的 operator/job 执行角色中。

# Spark Operator 日志
<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 如果未提供，将通过获取。
+ **s3 MonitoringConfiguration** — 将此选项设置为存档到 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
    ```
+ **cloudWatchMonitoring配置**-用于设置转发的配置密钥 Amazon CloudWatch。
  + **logGroupName**（必填）-要向其发送 Amazon CloudWatch 日志的日志组的名称。如果日志组不存在，则会自动创建。
  + **logStreamName前缀**（可选）-您要向其发送日志的日志流的名称。默认值是空字符串。中的格式 Amazon CloudWatch 如下：

    ```
    ${logStreamNamePrefix}/${POD NAME}/STDOUT or STDERR
    ```
+ **sideCarResources**（可选）— 用于在启动的 Fluentd sidecar 容器上设置资源限制的配置密钥。
  + **memoryLimit**（可选）：内存限制。根据自身需求进行调整。默认值为 512Mi。
  + **cpuLimit**（可选）：CPU 限制。根据自身需求进行调整。默认值为 500m。
+ **containerLogRotation配置**（可选）-控制容器日志的轮换行为。该功能默认已启用。
  + **rotationSize**（必需）：指定日志轮换的文件大小。可行值的范围从 2KB 到 2GB 不等。rotationSize 参数的数字单位部分以整数形式传递。由于不支持十进制值，您可以指定 1.5GB 的轮换大小，例如值 1500MB。默认值为 2GB。
  + maxFilesToKee@@ **p**（必填）-指定轮换后要在容器中保留的最大文件数。最小值为 1，最大值为 50。默认值为 10。

*配置 MonitoringC* onfiguration 后，你应该能够在 Amazon S3 存储桶 Amazon CloudWatch 或两者上查看 spark 操作员容器日志。对于 Amazon S3 存储桶，需要等待 2 分钟才能刷新第一个日志文件。

要查找日志 Amazon CloudWatch，您可以导航到以下位置：**CloudWatch**> **日志组** > > /operator *Pod name***/**st ***Log group name***derr

或者你可以导航到：**CloudWatch**> **日志组** > > /operator *Pod name***/**st ***Log group name***dout

# 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 如果未提供，将通过获取。
+ **s3 MonitoringConfiguration** — 将此选项设置为存档到 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
    ```
+ **cloudWatchMonitoring配置**-用于设置转发的配置密钥 Amazon CloudWatch。
  + **logGroupName**（必填）— 您要向其发送日志的 Cloudwatch 日志组的名称。如果日志组不存在，则会自动创建。
  + **logStreamName前缀**（可选）-您要向其发送日志的日志流的名称。默认值是空字符串。中的格式 CloudWatch 如下：

    ```
    ${logStreamNamePrefix}/${APPLICATION NAME}-${APPLICATION UID}/${POD NAME}/stdout
    ${logStreamNamePrefix}/${APPLICATION NAME}-${APPLICATION UID}/${POD NAME}/stderr
    ```
+ **sideCarResources**（可选）— 用于在启动的 Fluentd sidecar 容器上设置资源限制的配置密钥。
  + **memoryLimit**（可选）：内存限制。根据自身需求进行调整。默认值为 250Mi。
  + **cpuLimit**：CPU 限制。根据自身需求进行调整。默认值为 500m。
+ **containerLogRotation配置**（可选）-控制容器日志的轮换行为。该功能默认已启用。
  + **rotationSize**（必需）：指定日志轮换的文件大小。可行值的范围从 2KB 到 2GB 不等。rotationSize 参数的数字单位部分以整数形式传递。由于不支持十进制值，您可以指定 1.5GB 的轮换大小，例如值 1500MB。默认值为 2GB。
  + maxFilesToKee@@ **p**（必填）-指定轮换后要在容器中保留的最大文件数。最小值为 1。最大值为 50。默认值为 10。

配置 MonitoringConfiguration 后，您应该能够在 Amazon S3 存储桶或 CloudWatch 两者上查看您的 spark 应用程序驱动程序和执行器日志。对于 Amazon S3 存储桶，需要等待 2 分钟才能刷新第一个日志文件。例如，在 Amazon S3 中，存储桶路径如下所示：

**亚马逊 S3** **> **存储桶** > ***Bucket name***> *Spark application name - UUID* > *Pod Name* > stderr.gz**

或：

**亚马逊 S3** **> **存储桶** > ***Bucket name***> *Spark application name - UUID* > *Pod Name* > stdout.gz**

在中 CloudWatch，路径如下所示：

**CloudWatch**> **日志组** > ***Log group name***> *Pod name***/*Spark application name - UUID*/stderr**

或：

**CloudWatch**> **日志组** > ***Log group name***> *Pod name***/*Spark application name - UUID*/stdout**