

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

# 日志记录和监控
<a name="logging-monitoring"></a>

监控是维护 EMR Serverless 应用程序和作业的可靠性、可用性和性能的一个重要环节。您应该收集 EMR Serverless 解决方案所有部分的监控数据，以便在发生多点故障时更轻松地进行调试。

**Topics**
+ [存储日志](logging.md)
+ [轮换日志](rotating-logs.md)
+ [加密日志](jobs-log-encryption.md)
+ [为 Amazon EMR Serverless 配置 Apache Log4j2 属性](log4j2.md)
+ [监控 EMR Serverless](metrics.md)
+ [使用无服务器自动执行 EMR Amazon EventBridge](using-eventbridge.md)

# 存储日志
<a name="logging"></a>

要在 EMR Serverless 上监控作业进度并排除作业故障，请选择 EMR Serverless 存储和提供应用程序日志的方式。提交任务运行时，请将托管存储、Amazon S3 和 Amazon 指定 CloudWatch 为日志选项。

使用 CloudWatch，指定要使用的日志类型和日志位置，或者接受默认的类型和位置。有关 CloudWatch 日志的更多信息，请参阅[使用 Amazon 登录 EMR 无服务器 CloudWatch](#jobs-log-storage-cw)。对于托管存储和 S3 日志记录，下表列出了选择[托管存储](#jobs-log-storage-managed-storage)、[Amazon S3 存储桶](#jobs-log-storage-s3-buckets)或两者时预期的日志位置和 UI 可用性。


| Option | 事件日志 | 容器日志 | 应用程序 UI | 
| --- | --- | --- | --- | 
|  托管存储  |  存储在托管存储中  |  存储在托管存储中  |  支持  | 
|  托管存储和 S3 存储桶  |  存放在两个位置  |  存储在 S3 存储桶中  |  支持  | 
|  亚马逊 S3 存储桶  |  存储在 S3 存储桶中  |  存储在 S3 存储桶中  |  不支持1  | 

1 建议您保持选中**托管存储**。否则，您将无法使用内置应用程序 UIs。

## 使用托管存储的 EMR Serverless 日志记录
<a name="jobs-log-storage-managed-storage"></a>

默认情况下，EMR Serverless 将应用程序日志安全存储在 Amazon EMR 托管存储中，最长 30 天。

**注意**  
如果关闭默认选项，Amazon EMR 将无法代表您对作业进行故障排除。示例：您无法从 EMR Serverless 控制台访问 Spark-UI。

要从 EMR Studio 关闭此选项，请取消选中 “**提交**作业” 页面的 “**其他设置**” 部分中的 “**允许 AWS 将日志保留 30 天**” 复选框。

要从中关闭此选项 AWS CLI，请在提交作业运行时使用该`managedPersistenceMonitoringConfiguration`配置。

```
{
    "monitoringConfiguration": {
        "managedPersistenceMonitoringConfiguration": {
            "enabled": false
        }
    }
}
```

如果您的 EMR Serverless 应用程序位于具有适用于 Amazon S3 的 VPC 端点的私有子网中，并且您附加了端点策略来控制访问，请为 EMR Serverless 添加以下权限以存储和提供应用程序日志。请将 `Resource` 替换为 [Sample policies for private subnets that access Amazon S3](https://docs.aws.amazon.com/emr/latest/ManagementGuide/private-subnet-iampolicy.html#private-subnet-iampolicy-regions) 中可用区域表中的 `AppInfo` 存储桶。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "EMRServerlessManagedLogging",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": [
        "arn:aws:s3:::prod.us-east-1.appinfo.src",
        "arn:aws:s3:::prod.us-east-1.appinfo.src/*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:PrincipalServiceName": "emr-serverless.amazonaws.com",
          "aws:SourceVpc": "vpc-12345678"
        }
      }
    }
  ]
}
```

------

此外，使用 `aws:SourceVpc` 条件键确保请求通过 VPC 端点所附加的 VPC 进行传输。

## 使用 Amazon S3 存储桶的 EMR Serverless 日志记录
<a name="jobs-log-storage-s3-buckets"></a>

在作业将日志数据发送到 Amazon S3 之前，请在作业运行时角色的权限策略中包含以下权限。将 `amzn-s3-demo-logging-bucket` 替换为日志记录存储桶的名称。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/*"
      ],
      "Sid": "AllowS3Putobject"
    }
  ]
}
```

------

要设置 Amazon S3 存储桶来存储来自的日志 AWS CLI，请在开始运行任务时使用`s3MonitoringConfiguration`配置。为此，请在配置中提供以下 `--configuration-overrides`。

```
{
    "monitoringConfiguration": {
        "s3MonitoringConfiguration": {
            "logUri": "s3://amzn-s3-demo-logging-bucket/logs/"
        }
    }
}
```

对于未启用重试的批处理作业，EMR Serverless 会将日志发送到以下路径：

```
'/applications/<applicationId>/jobs/<jobId>'
```

EMR Serverless 将 Spark 驱动程序日志存储在以下路径中

```
'/applications/<applicationId>/jobs/<jobId>/SPARK_DRIVER/'
```

EMR Serverless 将 Spark 执行程序日志存储在以下路径中

```
'/applications/<applicationId>/jobs/<jobId>/SPARK_EXECUTOR/<EXECUTOR-ID>'
```

<EXECUTOR-ID> 是一个整数。

EMR Serverless 7.1.0 及更高版本支持流处理作业和批处理作业重试。如果您在启用重试的情况下运行作业，EMR Serverless 会自动在日志路径前缀中添加重试编号，以便更好地区分和跟踪日志。

```
'/applications/<applicationId>/jobs/<jobId>/attempts/<attemptNumber>/'
```

## 使用 Amazon 登录 EMR 无服务器 CloudWatch
<a name="jobs-log-storage-cw"></a>

当您向 EMR Serverless 应用程序提交任务时，请选择 Amazon CloudWatch 作为存储应用程序日志的选项。这允许您使用 CloudWatch 日志分析功能，例如 Logs Insights 和 Live Tail。 CloudWatch 您也可以将日志从其他系统流式传输 CloudWatch 到其他系统，例如 OpenSearch 进行进一步分析。

EMR Serverless 可实时记录驱动程序日志。您可以使用实时跟踪功能或通过 CloudWatch CLI tail 命令 CloudWatch 实时访问日志。

默认情况下，EMR Ser CloudWatch verless 的日志记录处于禁用状态。若要启用，请使用 [AWS CLI](#jobs-log-storage-cw-cli) 中的配置。

**注意**  
Amazon 实时 CloudWatch 发布日志，因此它会从工作人员那里获得更多资源。如果您选择较小的工作线程容量，可能会增加作业运行延迟。如果您启用 CloudWatch 日志记录，我们建议您选择更大的工作人员容量。如果每秒事务数（TPS）速率对于 `PutLogEvents` 来说太低，日志发布也可能会受到限制。 CloudWatch 限制配置适用于所有服务，包括 EMR Serverless。有关更多信息，请参阅[如何确定日志中的限制？ CloudWatch ](https://repost.aws/knowledge-center/cloudwatch-logs-throttling) 在 re *AWS : post* 上。

### 使用登录所需的权限 CloudWatch
<a name="jobs-log-storage-cw-permissions"></a>

在您的任务可以向 Amazon 发送日志数据之前 CloudWatch，请在任务运行时角色的权限策略中包含以下权限。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:DescribeLogGroups"
      ],
      "Resource": [
        "arn:aws:logs:*:123456789012:*"
      ],
      "Sid": "AllowLOGSDescribeloggroups"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:PutLogEvents",
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:DescribeLogStreams"
      ],
      "Resource": [
        "arn:aws:logs:*:123456789012:log-group:my-log-group-name:*"
      ],
      "Sid": "AllowLOGSPutlogevents"
    }
  ]
}
```

------

### AWS CLI
<a name="jobs-log-storage-cw-cli"></a>

要将 Amazon 设置为存储 CloudWatch 来自 EMR Serverless 的日志 AWS CLI，请在开始运行任务时使用`cloudWatchLoggingConfiguration`配置。为此，请提供以下配置覆盖。或者，还请提供日志组名称、日志流前缀名称、日志类型和加密密钥 ARN。

如果您未指定可选值，则使用默认日志流将日志 CloudWatch 发布到默认日志组`/aws/emr-serverless``/applications/applicationId/jobs/jobId/worker-type`。

EMR Serverless 7.1.0 及更高版本支持流处理作业和批处理作业重试。如果作业启用了重试，EMR Serverless 会自动在日志路径前缀中添加重试编号，以便更好地区分和跟踪日志。

```
'/applications/<applicationId>/jobs/<jobId>/attempts/<attemptNumber>/worker-type'
```

以下内容演示了使用 EMR Serverless 的默认设置开启 Amazon CloudWatch 日志记录所需的最低配置：

```
{
    "monitoringConfiguration": {
        "cloudWatchLoggingConfiguration": {
            "enabled": true
         }
     }
}
```

以下示例显示了所有必需和可选配置，这些配置指定何时为 EMR Serverless 启用 Amazon CloudWatch 日志功能。示例下方还列出了支持的 `logTypes` 值。

```
{
    "monitoringConfiguration": {
        "cloudWatchLoggingConfiguration": {
            "enabled": true, // Required
            "logGroupName": "Example_logGroup", // Optional
            "logStreamNamePrefix": "Example_logStream", // Optional 
            "encryptionKeyArn": "key-arn", // Optional 
            "logTypes": { 
                "SPARK_DRIVER": ["stdout", "stderr"] //List of values
             }
         }
     }
}
```

默认情况下，EMR Serverless 仅向发布驱动程序 stdout 和 stderr 日志。 CloudWatch如果需要其他日志，请在 `logTypes` 字段中指定容器角色和相应的日志类型。

以下列表显示了为 `logTypes` 配置指定的受支持工作线程类型：

**Spark**  
+ `SPARK_DRIVER : ["STDERR", "STDOUT"]`
+ `SPARK_EXECUTOR : ["STDERR", "STDOUT"]`

**Hive**  
+ `HIVE_DRIVER : ["STDERR", "STDOUT", "HIVE_LOG", "TEZ_AM"]`
+ `TEZ_TASK : ["STDERR", "STDOUT", "SYSTEM_LOGS"]`

# 轮换日志
<a name="rotating-logs"></a>

Amazon EMR Serverless 可以轮换 Spark 应用程序日志和事件日志。日志轮换有助于解决长时间运行的作业生成大型日志文件，而占用磁盘空间的问题。轮换日志有助于节省磁盘存储空间，减少因磁盘空间不足而导致的作业失败次数。

默认情况下，日志轮换处于启用状态，且仅适用于 Spark 作业。

**Spark 事件日志**

**注意**  
Spark 事件日志轮换适用于所有 Amazon EMR 发行版标签。

EMR Serverless 不是生成单个事件日志文件，而是定期轮换事件日志并删除旧的事件日志文件。轮换日志不会影响上传到 S3 存储桶的日志。

**Spark 应用程序日志**

**注意**  
Spark 应用程序日志轮换适用于所有 Amazon EMR 发行版标签。

EMR Serverless 还会轮换驱动程序和执行程序的 Spark 应用程序日志，例如 `stdout` 和 `stderr`。您可以使用 Spark History Server 和 Live UI 链接在 Studio 中选择日志链接来访问最新的日志文件。日志文件是最新日志的截断版本。要查看旧的轮换日志，请在存储日志时指定 Amazon S3 位置。有关更多信息，请参阅[使用 Amazon S3 存储桶的 EMR Serverless 日志记录](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/logging.html#jobs-log-storage-s3-buckets)。

您可以在以下位置找到最新的日志文件。EMR Serverless 每 15 秒刷新一次文件。这些文件的大小从 0MB 到 128MB 不等。

```
<example-S3-logUri>/applications/<application-id>/jobs/<job-id>/SPARK_DRIVER/stderr.gz
```

以下位置包含旧的轮换文件。每个文件都是 128MB。

```
<example-S3-logUri>/applications/<application-id>/jobs/<job-id>/SPARK_DRIVER/archived/stderr_<index>.gz 
```

同样的行为也适用于 Spark 执行程序。此更改仅适用于 S3 日志记录。日志轮换不会对上传到 Amazon 的日志流进行任何更改 CloudWatch。

EMR Serverless 7.1.0 及更高版本支持流处理和批处理作业重试。如果您在作业中启用了重试，EMR Serverless 会在此类作业的日志路径中添加前缀，以便更好地跟踪和区分日志。此路径包含所有轮换日志。

```
'/applications/<applicationId>/jobs/<jobId>/attempts/<attemptNumber>/'.
```

# 加密日志
<a name="jobs-log-encryption"></a>

## 使用托管存储加密 EMR Serverless 日志
<a name="jobs-log-encryption-managed-storage"></a>

要使用您自己的 KMS 密钥加密托管存储中的日志，请在提交作业运行时使用 `managedPersistenceMonitoringConfiguration` 配置。

```
{
    "monitoringConfiguration": {
        "managedPersistenceMonitoringConfiguration" : {
            "encryptionKeyArn": "key-arn"
        }
    }
}
```

## 使用 Amazon S3 存储桶加密 EMR Serverless 日志
<a name="jobs-log-encryption-s3-buckets"></a>

要使用您自己的 KMS 密钥加密 Amazon S3 存储桶中的日志，请在提交作业运行时使用 `s3MonitoringConfiguration` 配置。

```
{
    "monitoringConfiguration": {
        "s3MonitoringConfiguration": {
            "logUri": "s3://amzn-s3-demo-logging-bucket/logs/",
            "encryptionKeyArn": "key-arn"
        }
    }
}
```

## 使用 Amazon 加密 EMR 无服务器日志 CloudWatch
<a name="jobs-log-encryption-cw"></a>

要使用您自己的 KMS 密钥加密 Amazon CloudWatch 中的日志，请在提交任务运行时使用该`cloudWatchLoggingConfiguration`配置。

```
{
    "monitoringConfiguration": {
        "cloudWatchLoggingConfiguration": {
            "enabled": true,
            "encryptionKeyArn": "key-arn"
         }
     }
}
```

## 日志加密所需的权限
<a name="jobs-log-encryption-permissions"></a>

**Topics**
+ [所需的用户权限](#jobs-log-encryption-permissions-user)
+ [Amazon S3 和托管存储的加密密钥权限](#jobs-log-encryption-permissions-s3)
+ [Amazon 的加密密钥权限 CloudWatch](#jobs-log-encryption-permissions-cw)

### 所需的用户权限
<a name="jobs-log-encryption-permissions-user"></a>

提交作业、查看日志或应用程序的用户 UIs 必须具有使用密钥的权限。您可以在 KMS 密钥政策或 IAM 策略中为用户、组或角色指定权限。如果提交作业的用户没有 KMS 密钥权限，EMR Serverless 会拒绝提交作业运行。

**示例密钥政策**

以下密钥政策提供了对 `kms:GenerateDataKey` 和 `kms:Decrypt` 的权限：

```
{
    "Effect": "Allow",
    "Principal":{
       "AWS": "arn:aws:iam::111122223333:user/user-name"
     },
     "Action": [
       "kms:GenerateDataKey",       
       "kms:Decrypt"
      ],
     "Resource": "*"
 }
```

**示例 IAM 策略**

以下 IAM 策略提供了对 `kms:GenerateDataKey` 和 `kms:Decrypt` 的权限：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:GenerateDataKey",
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:kms:*:123456789012:key/12345678-1234-1234-1234-123456789012"
      ],
      "Sid": "AllowKMSGeneratedatakey"
    }
  ]
}
```

------

要启动 Spark 或 Tez UI，请授予用户、组或角色访问 `emr-serverless:GetDashboardForJobRun` API 的权限，如下所示：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "emr-serverless:GetDashboardForJobRun"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "AllowEMRSERVERLESSGetdashboardforjobrun"
    }
  ]
}
```

------

### Amazon S3 和托管存储的加密密钥权限
<a name="jobs-log-encryption-permissions-s3"></a>

在托管存储或 S3 存储桶中使用自己的加密密钥对日志进行加密时，请按如下方式配置 KMS 密钥权限。

在 KMS 密钥政策中，`emr-serverless.amazonaws.com` 主体必须具有以下权限：

```
{
    "Effect": "Allow",
    "Principal":{
       "Service": "emr-serverless.amazonaws.com" 
     },
     "Action": [
       "kms:Decrypt",
       "kms:GenerateDataKey"
      ],
     "Resource": "*"
     "Condition": {
       "StringLike": {
         "aws:SourceArn": "arn:aws:emr-serverless:region:aws-account-id:/applications/application-id"
       }
     }
 }
```

作为安全最佳实践，建议在 KMS 密钥策略中添加 `aws:SourceArn` 条件键。IAM 全局条件键 `aws:SourceArn` 可确保 EMR Serverless 仅将 KMS 密钥用于应用程序 ARN。

作业运行时角色必须在其 IAM 策略中具有以下权限：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:GenerateDataKey",
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:kms:*:123456789012:key/12345678-1234-1234-1234-123456789012"
      ],
      "Sid": "AllowKMSGeneratedatakey"
    }
  ]
}
```

------

### Amazon 的加密密钥权限 CloudWatch
<a name="jobs-log-encryption-permissions-cw"></a>

要将 KMS 密钥 ARN 关联到日志组，请对作业运行时角色使用以下 IAM 策略。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:AssociateKmsKey"
      ],
      "Resource": [
        "arn:aws:logs:*:123456789012:log-group:my-log-group-name:*"
      ],
      "Sid": "AllowLOGSAssociatekmskey"
    }
  ]
}
```

------

配置 KMS 密钥策略以向 Amazon 授予 KMS 权限 CloudWatch：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "key-default-1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "ArnLike": {
          "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:*:123456789012:*"
        }
      },
      "Sid": "AllowKMSDecrypt"
    }
  ]
}
```

------

# 为 Amazon EMR Serverless 配置 Apache Log4j2 属性
<a name="log4j2"></a>

本页面介绍了如何在 `StartJobRun` 中为 EMR Serverless 作业配置自定义 [Apache Log4j 2.x](https://logging.apache.org/log4j/2.x/) 属性。如果要在应用程序级别配置 Log4j 分类，请参阅 [EMR Serverless 的默认应用程序配置](default-configs.md)。

## 为 Amazon EMR Serverless 配置 Spark Log4j2 属性
<a name="log4j2-spark"></a>

在 Amazon EMR 6.8.0 及更高版本中，您可以自定义 [Apache Log4j 2.x](https://logging.apache.org/log4j/2.x/) 属性，以指定细粒度的日志配置。这简化了 EMR Serverless 上 Spark 作业的故障排除。要配置这些属性，请使用 `spark-driver-log4j2` 和 `spark-executor-log4j2` 分类。

**Topics**
+ [Spark 的 Log4j2 分类](#log4j2-spark-class)
+ [Spark 的 Log4j2 配置示例](#log4j2-spark-example)
+ [示例 Spark 作业中的 Log4j2](#log4j2-spark-jobs)
+ [Spark 的 Log4j2 注意事项](#log4j2-spark-considerations)

### Spark 的 Log4j2 分类
<a name="log4j2-spark-class"></a>

要自定义 Spark 日志配置，请在 [https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_ConfigurationOverrides.html#emrserverless-Type-ConfigurationOverrides-applicationConfiguration](https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_ConfigurationOverrides.html#emrserverless-Type-ConfigurationOverrides-applicationConfiguration) 中使用以下分类。要配置 Log4j 2.x 属性，请使用以下 [https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_Configuration.html#emrserverless-Type-Configuration-properties](https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_Configuration.html#emrserverless-Type-Configuration-properties)。

**`spark-driver-log4j2`**  
该分类为驱动程序设置 `log4j2.properties` 文件中的值。

**`spark-executor-log4j2`**  
该分类为执行程序设置 `log4j2.properties` 文件中的值。

### Spark 的 Log4j2 配置示例
<a name="log4j2-spark-example"></a>

以下示例展示了如何向 `applicationConfiguration` 提交 Spark 作业，以便为 Spark 驱动程序和执行程序自定义 Log4j2 配置。

要在应用程序级别而不是在提交作业时配置 Log4j 分类，请参阅 [EMR Serverless 的默认应用程序配置](default-configs.md)。

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "sparkSubmit": {
            "entryPoint": "/usr/lib/spark/examples/jars/spark-examples.jar",
            "entryPointArguments": ["1"],
            "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi --conf spark.executor.cores=4 --conf spark.executor.memory=20g --conf spark.driver.cores=4 --conf spark.driver.memory=8g --conf spark.executor.instances=1"
        }
    }'
    --configuration-overrides '{
        "applicationConfiguration": [
             {
                "classification": "spark-driver-log4j2",
                "properties": {
                    "rootLogger.level":"error", // will only display Spark error logs
                    "logger.IdentifierForClass.name": "classpath for setting logger",
                    "logger.IdentifierForClass.level": "info"
                   
                }
            },
            {
                "classification": "spark-executor-log4j2",
                "properties": {
                    "rootLogger.level":"error", // will only display Spark error logs
                    "logger.IdentifierForClass.name": "classpath for setting logger",
                    "logger.IdentifierForClass.level": "info"
                }
            }
       ]
    }'
```

### 示例 Spark 作业中的 Log4j2
<a name="log4j2-spark-jobs"></a>

以下代码示例演示了如何在初始化应用程序的自定义 Log4j2 配置时创建 Spark 应用程序。

------
#### [ Python ]

**Example 使用 Log4j2 通过 Python 执行 Spark 作业**  

```
import os
import sys

from pyspark import SparkConf, SparkContext
from pyspark.sql import SparkSession

app_name = "PySparkApp"
if __name__ == "__main__":
    spark = SparkSession\
        .builder\
        .appName(app_name)\
        .getOrCreate()
    
    spark.sparkContext._conf.getAll()
    sc = spark.sparkContext
    log4jLogger = sc._jvm.org.apache.log4j
    LOGGER = log4jLogger.LogManager.getLogger(app_name)

    LOGGER.info("pyspark script logger info")
    LOGGER.warn("pyspark script logger warn")
    LOGGER.error("pyspark script logger error")
    
    // your code here
    
    spark.stop()
```
要在执行 Spark 作业时为驱动程序自定义 Log4j2，请使用以下配置：  

```
{
   "classification": "spark-driver-log4j2",
      "properties": {
          "rootLogger.level":"error", // only display Spark error logs
          "logger.PySparkApp.level": "info", 
          "logger.PySparkApp.name": "PySparkApp"
      }
}
```

------
#### [ Scala ]

**Example 使用 Log4j2 通过 Scala 执行 Spark 作业**  

```
import org.apache.log4j.Logger
import org.apache.spark.sql.SparkSession

object ExampleClass {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession
    .builder
    .appName(this.getClass.getName)
    .getOrCreate()

    val logger = Logger.getLogger(this.getClass);
    logger.info("script logging info logs")
    logger.warn("script logging warn logs")
    logger.error("script logging error logs")

// your code here
    spark.stop()
  }
}
```
要在执行 Spark 作业时为驱动程序自定义 Log4j2，请使用以下配置：  

```
{
   "classification": "spark-driver-log4j2",
      "properties": {
          "rootLogger.level":"error", // only display Spark error logs
          "logger.ExampleClass.level": "info", 
          "logger.ExampleClass.name": "ExampleClass"
      }
}
```

------

### Spark 的 Log4j2 注意事项
<a name="log4j2-spark-considerations"></a>

以下 Log4j2.x 属性不可针对 Spark 进程进行配置：
+ `rootLogger.appenderRef.stdout.ref`
+ `appender.console.type`
+ `appender.console.name`
+ `appender.console.target`
+ `appender.console.layout.type`
+ `appender.console.layout.pattern`

[有关配置的 Log4j2.x 属性的详细信息，请参阅上的文件。`log4j2.properties.template`](https://github.com/apache/spark/blob/v3.3.0/conf/log4j2.properties.template) GitHub

# 监控 EMR Serverless
<a name="metrics"></a>

本节介绍监控 Amazon EMR Serverless 应用程序和作业的方法。

**Topics**
+ [监控 EMR Serverless 应用程序和作业](app-job-metrics.md)
+ [使用 Amazon Managed Service for Prometheus 监控 Spark 指标](monitor-with-prometheus.md)
+ [EMR Serverless 用量指标](monitoring-usage.md)

# 监控 EMR Serverless 应用程序和作业
<a name="app-job-metrics"></a>

借助 EMR Serverless 的 Amazon CloudWatch 指标，您可以接收 1 分钟的 CloudWatch 指标并访问 CloudWatch 控制面板，以访问 EMR 无服务器应用程序的 near-real-time操作和性能。

EMR Serverless 每分钟发送一次指标。 CloudWatch EMR Serverless 在应用程序级别以及作业、工作人员类型和级别发布这些指标。 capacity-allocation-type

要开始使用 EMR 无服务器存储库中提供的 EMR 无服务器 CloudWatch 仪表板模板并进行部[署](https://github.com/aws-samples/emr-serverless-samples/tree/main/cloudformation/emr-serverless-cloudwatch-dashboard/)。 GitHub 

**注意**  
[EMR Serverless 交互式工作负载](interactive-workloads.md)仅启用了应用程序级别监控，并具有新的工作线程类型维度 `Spark_Kernel`。要监控和调试交互式工作负载，请[在 EMR Studio Workspace 中](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-debug.html#emr-studio-debug-serverless)访问日志和 Apache Spark UI。

## 监控指标
<a name="app-job-metrics-versions"></a>

**重要**  
我们正在重组指标显示以添加 `ApplicationName` 和 `JobName` 作为维度。对于 7.10 及更高版本，旧指标将不再更新。对于 7.10 以下的 EMR 发行版，旧的指标仍然可用。

**当前维度**

下表描述了 `AWS/EMR Serverless` 命名空间中可用的 EMR Serverless 维度。


**EMR Serverless 指标的维度**  

| 维度 | 说明 | 
| --- | --- | 
| ApplicationId | 使用应用程序 ID 筛选 EMR Serverless 应用程序的所有指标。 | 
| ApplicationName | 使用名称筛选 EMR Serverless 应用程序的所有指标。如果未提供名称或包含非 ASCII 字符，则系统会将其发布为 **[未指定]**。 | 
| JobId | 筛选 EMR Serverless 作业运行 ID 的所有指标。 | 
| JobName | 使用名称筛选 EMR Serverless 作业运行的所有指标。如果未提供名称或包含非 ASCII 字符，则系统会将其发布为 **[未指定]**。 | 
| WorkerType | 筛选给定工作线程类型的所有指标。例如，您可以筛选 Spark 作业的 `SPARK_DRIVER` 和 `SPARK_EXECUTORS`。 | 
| CapacityAllocationType | 筛选给定容量分配类型的所有指标。例如，您可以筛选预初始化容量 `PreInitCapacity` 和其他容量 `OnDemandCapacity`。 | 

## 应用程序级别监控
<a name="app-level-metrics"></a>

您可以使用 Amazon 指标在 EMR 无服务器应用程序级别监控容量使用情况。 CloudWatch 您还可以设置单个显示器来监控 CloudWatch 仪表板中的应用程序容量使用情况。


**EMR Serverless 应用程序指标**  

| 指标 | 说明 | 单位 | 维度 | 
| --- | --- | --- | --- | 
| MaxCPUAllowed |  应用程序允许的最大 CPU 数。  | vCPU | ApplicationId, ApplicationName | 
| MaxMemoryAllowed |  应用程序允许的最大内存（GB）。  | 千兆字节（GB） | ApplicationId, ApplicationName | 
| MaxStorageAllowed |  应用程序允许的最大存储空间（GB）。  | 千兆字节（GB） | ApplicationId, ApplicationName | 
| CPUAllocated |  CPUs 分配的 v 的总数。  | vCPU | ApplicationId, ApplicationName, WorkerType, CapacityAllocationType | 
| IdleWorkerCount |  空闲的工作线程总数。  | 计数 | ApplicationId, ApplicationName, WorkerType, CapacityAllocationType | 
| MemoryAllocated |  分配的总内存（GB）。  | 千兆字节（GB） | ApplicationId, ApplicationName, WorkerType, CapacityAllocationType | 
| PendingCreationWorkerCount |  待创建的工作线程总数。  | 计数 | ApplicationId, ApplicationName, WorkerType, CapacityAllocationType | 
| RunningWorkerCount |  应用程序使用的工作线程总数。  | 计数 | ApplicationId, ApplicationName, WorkerType, CapacityAllocationType | 
| StorageAllocated |  分配的总磁盘存储空间（GB）。  | 千兆字节（GB） | ApplicationId, ApplicationName, WorkerType, CapacityAllocationType | 
| TotalWorkerCount |  可用的工作线程总数。  | 计数 | ApplicationId, ApplicationName, WorkerType, CapacityAllocationType | 

## 作业级别监控
<a name="job-level-metrics"></a>

Amazon EMR Serverless 每隔一分钟向 Amazon CloudWatch 发送以下作业级别指标。您可以按作业运行状态访问聚合作业运行的指标值。每个指标的单位是*计数*。


**EMR Serverless 作业级别指标**  

| 指标 | 说明 | 维度 | 
| --- | --- | --- | 
| SubmittedJobs | 处于“已提交”状态的作业数量。 | ApplicationId, ApplicationName | 
| PendingJobs | 处于“待定”状态的作业数量。 | ApplicationId, ApplicationName | 
| ScheduledJobs | 处于“已计划”状态的作业数量。 | ApplicationId, ApplicationName | 
| RunningJobs | 处于“运行中”状态的作业数量。 | ApplicationId, ApplicationName | 
| SuccessJobs | 处于“成功”状态的作业数量。 | ApplicationId, ApplicationName | 
| FailedJobs | 处于“失败”状态的作业数量。 | ApplicationId, ApplicationName | 
| CancellingJobs | 处于“取消中”状态的作业数量。 | ApplicationId, ApplicationName | 
| CancelledJobs | 处于“已取消”状态的作业数量。 | ApplicationId, ApplicationName | 

您可以使用特定于引擎的应用程序监控特定于引擎的指标，以了解正在运行和已完成的 EMR Serverless 作业。 UIs当您访问运行中作业的 UI 时，系统会显示具有实时更新的实时应用程序 UI。当您访问已完成作业的 UI 时，系统会显示持久性应用程序 UI。

**运行作业**

对于运行中的 EMR Serverless 作业，请访问提供特定于引擎的指标的实时界面。您可以使用 Apache Spark UI 或 Hive Tez UI 来监控和调试作业。要访问这些内容 UIs，请使用 EMR Studio 控制台或使用请求安全 URL 端点。 AWS Command Line Interface

**已完成作业**

对于已完成的 EMR Serverless 作业，请使用 Spark History Server 或 Persistent Hive Tez UI 访问 Spark 或 Hive 作业运行的作业详细信息、阶段、任务和指标。要访问这些内容 UIs，请使用 EMR Studio 控制台，或者使用请求安全 URL 端点。 AWS Command Line Interface

## 作业工作线程级别监控
<a name="job-worker-level-metrics"></a>

Amazon EMR Serverless 将`AWS/EMRServerless`命名空间和指标组中可用的以下作业工作人员级别的`Job Worker Metrics`指标发送给亚马逊。 CloudWatchEMR Serverless 在作业运行期间，在作业级别、工作人员类型和级别收集单个工作人员的数据点。 capacity-allocation-type您可以使用 `ApplicationId` 作为一个维度来监控属于同一应用程序的多个作业。

**注意**  
要查看 EMR Serverless 任务在 Amazon CloudWatch 控制台中查看指标时使用的 CPU 和内存总量，请使用统计数据作为总和，将周期设置为 1 分钟。


**EMR Serverless 作业工作线程级别指标**  

| 指标 | 说明 | 单位 | 维度 | 
| --- | --- | --- | --- | 
| WorkerCpuAllocated | 作业运行中分配给工作线程的 vCPU 核心总数。 | vCPU | JobId、JobName、ApplicationId、ApplicationName、WorkerType 和 CapacityAllocationType | 
| WorkerCpuUsed | 作业运行中工作线程使用的 vCPU 核心总数。 | vCPU | JobId、JobName、ApplicationId、ApplicationName、WorkerType 和 CapacityAllocationType | 
| WorkerMemoryAllocated | 作业运行中分配给工作线程的总内存（GB）。 | 千兆字节（GB） | JobId、JobName、ApplicationId、ApplicationName、WorkerType 和 CapacityAllocationType | 
| WorkerMemoryUsed | 作业运行中工作线程使用的总内存（GB）。 | 千兆字节（GB） | JobId、JobName、ApplicationId、ApplicationName、WorkerType 和 CapacityAllocationType | 
| WorkerEphemeralStorageAllocated | 作业运行中分配给工作线程的临时存储字节数。 | 千兆字节（GB） | JobId、JobName、ApplicationId、ApplicationName、WorkerType 和 CapacityAllocationType | 
| WorkerEphemeralStorageUsed | 作业运行中工作线程使用的临时存储字节数。 | 千兆字节（GB） | JobId、JobName、ApplicationId、ApplicationName、WorkerType 和 CapacityAllocationType | 
| WorkerStorageReadBytes | 作业运行中工作线程从存储中读取的字节数。 | 字节 | JobId、JobName、ApplicationId、ApplicationName、WorkerType 和 CapacityAllocationType | 
| WorkerStorageWriteBytes | 作业运行中从工作线程写入存储的字节数。 | 字节 | JobId、JobName、ApplicationId、ApplicationName、WorkerType 和 CapacityAllocationType | 

下面的步骤介绍了如何访问各种类型的指标。

------
#### [ Console ]

**使用控制台访问应用程序 UI**

1. 按照[控制台入门](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/getting-started.html#gs-console)中的说明，导航到 EMR Studio 上的 EMR Serverless 应用程序。

1. 要访问特定于引擎的应用程序 UIs 和正在运行的作业的日志，请执行以下操作：

   1. 选择状态为 `RUNNING` 的作业。

   1. 在**应用程序详细信息**页面上选择作业，或导航到作业的**作业详细信息**页面。

   1. 在**显示 UI** 下拉菜单下，选择 **Spark UI** 或 **Hive Tez UI**，导航到适合您作业类型的应用程序 UI。

   1. 要访问 Spark 引擎日志，请导航到 Spark UI 中的**执行程序**选项卡，然后选择驱动程序的**日志**链接。要访问 Hive 引擎日志，请在 Hive Tez UI 中选择相应 DAG 的**日志**链接。

1. 要访问已完成作业的特定引擎应用程序 UIs 和日志，请执行以下操作：

   1. 选择状态为 `SUCCESS` 的作业。

   1. 在应用程序的**应用程序详细信息**页面上选择作业，或导航到作业的**作业详细信息**页面。

   1. 在**显示 UI** 下拉菜单下，选择 **Spark History Server** 或 **Persistent Hive Tez UI**，导航到适合您作业类型的应用程序 UI。

   1. 要访问 Spark 引擎日志，请导航到 Spark UI 中的**执行程序**选项卡，然后选择驱动程序的**日志**链接。要访问 Hive 引擎日志，请在 Hive Tez UI 中选择相应 DAG 的**日志**链接。

------
#### [ AWS CLI ]

**要使用访问您的应用程序用户界面 AWS CLI**
+ 要生成一个 URL 用于访问运行中和已完成作业的应用程序 UI，请调用 `GetDashboardForJobRun` API。

  ```
  aws emr-serverless get-dashboard-for-job-run /
  --application-id <application-id> /
  --job-run-id <job-id>
  ```

  生成的 URL 在 1 小时内有效。

------

# 使用 Amazon Managed Service for Prometheus 监控 Spark 指标
<a name="monitor-with-prometheus"></a>

在 Amazon EMR 7.1.0 及更高版本中，您可以将 EMR Serverless 与 Amazon Managed Service for Prometheus 集成，来收集 EMR Serverless 作业和应用程序的 Apache Spark 指标。当您使用 AWS 控制台、EMR Serverless API 或提交任务或创建应用程序时，即可使用此集成。 AWS CLI

## 先决条件
<a name="monitoring-with-prometheus-prereqs"></a>

在将 Spark 指标传输到 Amazon Managed Service for Prometheus 之前，应满足以下先决条件。
+ [创建 Amazon Managed Service for Prometheus Workspace](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-onboard-create-workspace.html)。此工作空间用作摄取端点。记下**端点 - 远程写入 URL**中显示的 URL。创建 EMR Serverless 应用程序时，您需要指定 URL。
+ 要授予作业对 Amazon Managed Service for Prometheus 的访问权限以进行监控，请将以下策略添加到作业执行角色。

  ```
  {
      "Sid": "AccessToPrometheus",
      "Effect": "Allow",
      "Action": ["aps:RemoteWrite"],
      "Resource": "arn:aws:aps:<AWS_REGION>:<AWS_ACCOUNT_ID>:workspace/<WORKSPACE_ID>"
  }
  ```

## 设置
<a name="monitoring-with-prometheus-setup"></a>

**使用 AWS 控制台创建与亚马逊 Prometheus 托管服务集成的应用程序**

1. 要创建应用程序，请参阅[开始使用 Amazon EMR Serverless](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/getting-started.html                             )。

1. 在创建应用程序时，选择**使用自定义设置**，然后在要配置的字段中指定信息来配置应用程序。

1. 在**应用程序日志和指标**下，选择**将引擎指标传输到 Amazon Managed Service for Prometheus**，然后指定远程写入 URL。

1. 指定所需的任何其他配置设置，然后选择**创建并启动应用程序**。

**使用 AWS CLI 或 EMR 无服务器 API**

在运行或命令时，您还可以使用 AWS CLI 或 EMR Serverless API 将您的 EMR 无服务器应用程序与适用于 Prometheus 的亚马逊托管服务集成。`create-application` `start-job-run`

------
#### [ create-application ]

```
aws emr-serverless create-application \
--release-label emr-7.1.0 \
--type "SPARK" \
--monitoring-configuration '{ 
    "prometheusMonitoringConfiguration": {
        "remoteWriteUrl": "https://aps-workspaces.<AWS_REGION>.amazonaws.com/workspaces/<WORKSPACE_ID>/api/v1/remote_write"
    }
}'
```

------
#### [ start-job-run ]

```
aws emr-serverless start-job-run \
--application-id <APPPLICATION_ID> \
--execution-role-arn <JOB_EXECUTION_ROLE> \
--job-driver '{
    "sparkSubmit": {
        "entryPoint": "local:///usr/lib/spark/examples/src/main/python/pi.py",
        "entryPointArguments": ["10000"],
        "sparkSubmitParameters": "--conf spark.dynamicAllocation.maxExecutors=10"
    }
}' \
--configuration-overrides '{
     "monitoringConfiguration": {
        "prometheusMonitoringConfiguration": {
            "remoteWriteUrl": "https://aps-workspaces.<AWS_REGION>.amazonaws.com/workspaces/<WORKSPACE_ID>/api/v1/remote_write"
        }
    }
}'
```

------

在命令中包含 `prometheusMonitoringConfiguration` 表示 EMR Serverless 必须使用代理运行 Spark 作业，该代理负责收集 Spark 指标并将其写入 Amazon Managed Service for Prometheus 的 `remoteWriteUrl` 端点。然后，您可以使用 Amazon Managed Service for Prometheus 中的 Spark 指标进行可视化、警报和分析。

## 高级配置属性
<a name="monitoring-with-prometheus-config-options"></a>

EMR Serverless 使用 Spark 中名为 `PrometheusServlet` 的组件来收集 Spark 指标，并将性能数据转换为与 Amazon Managed Service for Prometheus 兼容的数据。默认情况下，EMR Serverless 会在 Spark 中设置默认值，并在使用 `PrometheusMonitoringConfiguration` 提交作业时解析驱动程序和执行程序指标。

下表介绍了在提交 Spark 作业以将指标发送到 Amazon Managed Service for Prometheus 时配置的所有属性。


| Spark 属性 | 默认 值 | 说明 | 
| --- | --- | --- | 
| spark.metrics.conf.\$1.sink.prometheusServlet.class | org.apache.spark.metrics.sink。 PrometheusServlet | Spark 用来将指标发送到 Amazon Managed Service for Prometheus 的类。要覆盖默认行为，请指定您自己的自定义类。 | 
| spark.metrics.conf.\$1.source.jvm.class | org.apache.spark.metrics.source。 JvmSource | Spark 用来从底层 Java 虚拟机收集和发送关键指标的类。要停止收集 JVM 指标，可将该属性设置为空字符串（如 `""`），将其禁用。要覆盖默认行为，请指定您自己的自定义类。 | 
| spark.metrics.conf.driver.sink.prometheusServlet.path | /metrics/prometheus | Amazon Managed Service for Prometheus 用来从驱动程序收集指标的独特 URL。要覆盖默认行为，请指定您自己的路径。要停止收集驱动程序指标，可将该属性设置为空字符串（如 `""`），将其禁用。 | 
| spark.metrics.conf.executor.sink.prometheusServlet.path | /metrics/executor/prometheus | Amazon Managed Service for Prometheus 用来从执行程序收集指标的独特 URL。要覆盖默认行为，请指定您自己的路径。要停止收集执行程序指标，可将该属性设置为空字符串（如 `""`），将其禁用。 | 

有关 Spark 指标的更多信息，请参阅 [Apache Spark 指标](https://spark.apache.org/docs/3.5.0/monitoring.html#metrics)。

## 注意事项和限制
<a name="monitoring-with-prometheus-limitations"></a>

当使用 Amazon Managed Service for Prometheus 从 EMR Serverless 收集指标时，请考虑以下注意事项和限制。
+ 只有[当 Amazon Managed Service for Prometheus 在AWS 区域 中普遍可用](https://docs.aws.amazon.com/general/latest/gr/prometheus-service.html)的情况下，才支持将 Amazon Managed Service for Prometheus 与 EMR Serverless 结合使用。
+ 运行代理以在 Amazon Managed Service for Prometheus 上收集 Spark 指标时需要工作线程提供更多资源。如果选择较小的工作线程规模（例如 1 个 vCPU 工作线程），作业运行时间可能会增加。
+ 仅 Amazon EMR 7.1.0 及更高版本支持将 Amazon Managed Service for Prometheus 与 EMR Serverless 结合使用。
+ Amazon Managed Service for Prometheus 必须部署在运行 EMR Serverless 的同一账户中才能收集指标。

# EMR Serverless 用量指标
<a name="monitoring-usage"></a>

您可以使用 Amazon CloudWatch 使用量指标来了解您的账户使用的资源。使用这些指标在 CloudWatch 图表和仪表板上可视化您的服务使用情况。

EMR Serverless 用量指标与服务配额对应。您可以配置警报，以在用量接近服务配额时向您发出警报。有关更多信息，请参阅[服务配额*用户指南中的服务配额*和亚马逊 CloudWatch警报](https://docs.aws.amazon.com/servicequotas/latest/userguide/configure-cloudwatch.html)。

有关 EMR Serverless 服务配额的更多信息，请参阅[EMR Serverless 端点和配额](endpoints-quotas.md)。

## EMR Serverless 的服务配额用量指标
<a name="usage-metrics"></a>

EMR Serverless 在 `AWS/Usage` 命名空间中发布以下服务配额用量指标。


****  

| 指标 | 说明 | 
| --- | --- | 
| `ResourceCount`  | 账户中正在运行的指定资源的总数。资源由与指标关联的[维度](#usage-metrics-dimensions)定义。 | 

## EMR Serverless 服务配额用量指标的维度
<a name="usage-metrics-dimensions"></a>

您可以使用以下维度来细化 EMR Serverless 发布的用量指标。


****  

| 维度 | 值 | 说明 | 
| --- | --- | --- | 
|  `Service`  |  EMR Serverless  |  AWS 服务 包含资源的名称。 | 
|  `Type`  |  资源  | EMR Serverless 报告的实体类型。 | 
|  `Resource`  |  vCPU  | EMR Serverless 跟踪的资源类型。 | 
|  `Class`  |  无  | EMR Serverless 跟踪的资源类。 | 

# 使用无服务器自动执行 EMR Amazon EventBridge
<a name="using-eventbridge"></a>

您可以使用 Amazon EventBridge 自动执行系统事件， AWS 服务 并自动响应系统事件，例如应用程序可用性问题或资源更改。 EventBridge 提供近乎实时的系统事件流，这些事件描述了您的 AWS 资源变化。您可以编写简单规则来指示您关注的事件，并指示要在事件匹配规则时执行的自动化操作。使用 EventBridge，您可以自动：
+ 调用一个 AWS Lambda 函数
+ 将事件中继到 Amazon Kinesis Data Streams
+ 激活 AWS Step Functions 状态机
+ 通知 Amazon SNS 主题或 Amazon SQS 队列

例如，当您 EventBridge 与 EMR Serverless 一起使用时，您可以在 ETL 任务成功时激活一个 AWS Lambda 函数，或者在 ETL 任务失败时通知 Amazon SNS 主题。

EMR Serverless 会发出四种事件：
+ 应用程序状态更改事件：每次应用程序状态更改时发出的事件。有关应用程序状态的更多信息，请参阅[应用程序状态](applications.md#application-states)。
+ 作业运行状态更改事件：每次作业运行状态更改时发出的事件。有关更多信息，请参阅[任务运行状态](job-states.md)。
+ 作业运行重试事件：每次 Amazon EMR Serverless 7.1.0 及更高版本的作业运行重试时发出的事件。
+ 作业资源利用率更新事件：作业运行每隔约 30 分钟更新资源利用率时发出的事件。

## EMR 无服务器事件示例 EventBridge
<a name="using-eventbridge-examples"></a>

EMR Serverless 报告的事件为 `source` 分配值 `aws.emr-serverless`，如以下示例所示。

**应用程序状态更改事件**

以下示例事件显示了处于 `CREATING` 状态的应用程序。

```
{
    "version": "0",
    "id": "9fd3cf79-1ff1-b633-4dd9-34508dc1e660",
    "detail-type": "EMR Serverless Application State Change",
    "source": "aws.emr-serverless",
    "account": "123456789012",
    "time": "2022-05-31T21:16:31Z",
    "region": "us-east-1",
    "resources": [],
    "detail": {
        "applicationId": "00f1cbsc6anuij25",
        "applicationName": "3965ad00-8fba-4932-a6c8-ded32786fd42",
        "arn": "arn:aws:emr-serverless:us-east-1:111122223333:/applications/00f1cbsc6anuij25",
        "releaseLabel": "emr-6.6.0",
        "state": "CREATING",
        "type": "HIVE",
        "createdAt": "2022-05-31T21:16:31.547953Z",
        "updatedAt": "2022-05-31T21:16:31.547970Z",
        "autoStopConfig": {
            "enabled": true,
            "idleTimeout": 15
        },
        "autoStartConfig": {
            "enabled": true
        }
    }
}
```

**作业运行状态更改事件**

以下示例事件显示了状态从 `SCHEDULED` 变为 `RUNNING` 的作业运行。

```
{
    "version": "0",
    "id": "00df3ec6-5da1-36e6-ab71-20f0de68f8a0",
    "detail-type": "EMR Serverless Job Run State Change",
    "source": "aws.emr-serverless",
    "account": "123456789012",
    "time": "2022-05-31T21:07:42Z",
    "region": "us-east-1",
    "resources": [],
    "detail": {
        "jobRunId": "00f1cbn5g4bb0c01",
        "applicationId": "00f1982r1uukb925",
        "arn": "arn:aws:emr-serverless:us-east-1:123456789012:/applications/00f1982r1uukb925/jobruns/00f1cbn5g4bb0c01",
        "releaseLabel": "emr-6.6.0",
        "state": "RUNNING",
        "previousState": "SCHEDULED",
        "createdBy": "arn:aws:sts::123456789012:assumed-role/TestRole-402dcef3ad14993c15d28263f64381e4cda34775/6622b6233b6d42f59c25dd2637346242",
        "updatedAt": "2022-05-31T21:07:42.299487Z",
        "createdAt": "2022-05-31T21:07:25.325900Z"
    }
}
```

**作业运行重试事件**

以下是作业运行重试事件的示例。

```
{
    "version": "0",
    "id": "00df3ec6-5da1-36e6-ab71-20f0de68f8a0",
    "detail-type": "EMR Serverless Job Run Retry",
    "source": "aws.emr-serverless",
    "account": "123456789012",
    "time": "2022-05-31T21:07:42Z",
    "region": "us-east-1",
    "resources": [],
    "detail": {
        "jobRunId": "00f1cbn5g4bb0c01",
        "applicationId": "00f1982r1uukb925",
        "arn": "arn:aws:emr-serverless:us-east-1:123456789012:/applications/00f1982r1uukb925/jobruns/00f1cbn5g4bb0c01",
        "releaseLabel": "emr-6.6.0",
        "createdBy": "arn:aws:sts::123456789012:assumed-role/TestRole-402dcef3ad14993c15d28263f64381e4cda34775/6622b6233b6d42f59c25dd2637346242",
        "updatedAt": "2022-05-31T21:07:42.299487Z",
        "createdAt": "2022-05-31T21:07:25.325900Z",
        //Attempt Details
        "previousAttempt": 1,
        "previousAttemptState": "FAILED",
        "previousAttemptCreatedAt": "2022-05-31T21:07:25.325900Z",
        "previousAttemptEndedAt": "2022-05-31T21:07:30.325900Z",
        "newAttempt": 2,
        "newAttemptCreatedAt": "2022-05-31T21:07:30.325900Z"
    }
}
```

**作业资源利用率更新**

以下示例事件显示了运行后转至最终状态的作业的最终资源利用率更新。

```
{
    "version": "0",
    "id": "00df3ec6-5da1-36e6-ab71-20f0de68f8a0",
    "detail-type": "EMR Serverless Job Resource Utilization Update",
    "source": "aws.emr-serverless",
    "account": "123456789012",
    "time": "2022-05-31T21:07:42Z",
    "region": "us-east-1",
    "resources": [
        "arn:aws:emr-serverless:us-east-1:123456789012:/applications/00f1982r1uukb925/jobruns/00f1cbn5g4bb0c01"
    ],
    "detail": {
        "applicationId": "00f1982r1uukb925",
        "jobRunId": "00f1cbn5g4bb0c01",
        "attempt": 1,
        "mode": "BATCH",
        "createdAt": "2022-05-31T21:07:25.325900Z",
        "startedAt": "2022-05-31T21:07:26.123Z",
        "calculatedFrom": "2022-05-31T21:07:42.299487Z",
        "calculatedTo": "2022-05-31T21:07:30.325900Z",
        "resourceUtilizationFinal": true,
        "resourceUtilizationForInterval": {
            "vCPUHour": 0.023,
            "memoryGBHour": 0.114,
            "storageGBHour": 0.228
        },
        "billedResourceUtilizationForInterval": {
            "vCPUHour": 0.067,
            "memoryGBHour": 0.333,
            "storageGBHour": 0
        },
        "totalResourceUtilization": {
            "vCPUHour": 0.023,
            "memoryGBHour": 0.114,
            "storageGBHour": 0.228
        },
        "totalBilledResourceUtilization": {
            "vCPUHour": 0.067,
            "memoryGBHour": 0.333,
            "storageGBHour": 0
        }
    }
}
```

仅当作业转至运行状态时，**startAt** 字段才会出现在事件中。