

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

# 使用管理作业运行 AWS CLI
<a name="emr-eks-jobs-CLI"></a>

本主题介绍如何使用 AWS Command Line Interface (AWS CLI) 管理作业运行。其中详细介绍了安全参数、驱动程序和各种覆盖设置等属性。还包括一些子课题，涵盖了配置日志记录的各种方法。

**Topics**
+ [配置任务运行的选项](#emr-eks-jobs-parameters)
+ [配置任务运行以使用 Amazon S3 日志](emr-eks-jobs-s3.md)
+ [将任务运行配置为使用 Amazon CloudWatch 日志](emr-eks-jobs-cloudwatch.md)
+ [列出任务运行](#emr-eks-jobs-list)
+ [描述任务运行](#emr-eks-jobs-describe)
+ [取消任务运行](#emr-eks-jobs-cancel)

## 配置任务运行的选项
<a name="emr-eks-jobs-parameters"></a>

使用以下选项配置任务运行参数：
+ `--execution-role-arn`：您必须提供用于运行任务的 IAM 角色。有关更多信息，请参阅 [将任务执行角色与 Amazon EMR on EKS 结合使用](iam-execution-role.md)。
+ `--release-label`：您可以使用 Amazon EMR 5.32.0 和 6.2.0 及更高版本部署 Amazon EMR on EKS。以前的 Amazon EMR 版本不支持 Amazon EMR on EKS。有关更多信息，请参阅 [Amazon EMR on EKS 版本](emr-eks-releases.md)。
+ `--job-driver`：任务驱动程序用于为主要任务提供输入。这是一个联合类型字段，您只能传递要运行的任务类型值之一。支持的任务类型包括：
  + Spark 提交任务 - 用于通过 Spark 提交运行命令。你可以使用这种作业类型通过 Spark Submit 运行 Scala、 PySpark、SparkR、sparkSQL 和任何其他支持的作业。此任务类型具有以下参数：
    + Entrypoint-这是对你要运行的主 jar/py 文件的 HCFS（兼容 Hadoop 的文件系统）的引用。
    + EntryPointArguments -这是您要传递给主 jar/py 文件的参数数组。您应该使用 Entrypoint 代码来处理读取这些参数。数组中的每个参数都应用逗号分隔。 EntryPointArguments 不能包含方括号或圆括号，例如 ()、\$1\$1 或 []。
    + SparkSubmitParameters -这些是您要发送给任务的其他 spark 参数。使用此参数可覆盖默认的 Spark 属性，例如驱动程序内存、—conf 或 —class 等执行程序的数量。有关更多信息，请参阅[使用 spark-submit 启动应用程序](https://spark.apache.org/docs/latest/submitting-applications.html#launching-applications-with-spark-submit)。
  + Spark SQL 任务 - 用于通过 Spark SQL 运行 SQL 查询文件。您可以使用此任务类型运行 SparkSQL 任务。此任务类型具有以下参数：
    + Entrypoint - 这是 HCFS（兼容 Hadoop 的文件系统）对要运行的 SQL 查询文件的引用。

      有关可用于 Spark SQL 任务的其他 Spark 参数的列表，请参阅 [通过 StartJobRun API 运行 Spark SQL 脚本](emr-eks-jobs-spark-sql-parameters.md)。
+ `--configuration-overrides`：您可以为应用程序提供配置对象以覆盖默认配置。您可以使用简写语法提供配置，或可引用 JSON 文件中的配置对象。配置对象包含分类、属性和可选的嵌套配置。属性由您希望在该文件中覆盖的设置组成。您可以在一个 JSON 对象中为多个应用程序指定多个分类。可用的配置分类因 Amazon EMR 发行版而异。有关 Amazon EMR 每个发行版可用的配置分类列表，请参阅[Amazon EMR on EKS 版本](emr-eks-releases.md)。

  如果在应用程序覆盖和 Spark 提交参数中传递相同的配置，则 Spark 提交参数优先。完整的配置优先级列表如下，按最高优先级到最低优先级的顺序排列。
  + 创建 `SparkSession` 时提供的配置。
  + 使用 `—conf` 作为 `sparkSubmitParameters` 的一部分提供的配置。
  + 作为应用程序覆盖的一部分提供的配置。
  + Amazon EMR 为发行版选择的优化配置。
  + 应用程序的默认开源配置。

  要使用 Amazon CloudWatch 或 Amazon S3 监控任务运行，您必须提供配置的详细信息 CloudWatch。有关更多信息，请参阅[配置任务运行以使用 Amazon S3 日志](emr-eks-jobs-s3.md)和[将任务运行配置为使用 Amazon CloudWatch 日志](emr-eks-jobs-cloudwatch.md)。如果 S3 存储桶或 CloudWatch 日志组不存在，则 Amazon EMR 会在将日志上传到存储桶之前创建该存储桶或日志组。
+ 有关 Kubernetes 配置选项的其它列表，请参阅 [Kubernetes 中的 Spark 属性](https://spark.apache.org/docs/latest/running-on-kubernetes.html#configuration)。

  不支持以下 Spark 配置。
  + `spark.kubernetes.authenticate.driver.serviceAccountName`
  + `spark.kubernetes.authenticate.executor.serviceAccountName`
  + `spark.kubernetes.namespace`
  + `spark.kubernetes.driver.pod.name`
  + `spark.kubernetes.container.image.pullPolicy`
  + `spark.kubernetes.container.image`
**注意**  
您可以将 `spark.kubernetes.container.image` 用于自定义 Docker 镜像。有关更多信息，请参阅 [为 Amazon EMR on EKS 自定义 Docker 镜像](docker-custom-images.md)。

# 配置任务运行以使用 Amazon S3 日志
<a name="emr-eks-jobs-s3"></a>

为了能够监控任务进度并排除故障，您必须将任务配置为向 Amazon S3、Amazon Logs 或两者发送 CloudWatch 日志信息。本主题可提供入门知识，帮助您将通过 Amazon EMR on EKS 启动的任务的应用程序日志发布到 Amazon S3。

**S3 日志 IAM policy**

任务执行角色的权限策略中必须包含以下权限，然后才能将日志数据发送到 Amazon S3。将 *amzn-s3-demo-logging-bucket* 替换为日志记录存储桶的名称。

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

****  

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

------

**注意**  
Amazon EMR on EKS 也可以创建 Amazon S3 存储桶。如果 Amazon S3 存储桶不可用，则 IAM policy 应包含 `“s3:CreateBucket”` 权限。

在您授予执行角色将日志发送到 Amazon S3 的合适权限后，只要 `s3MonitoringConfiguration` 通过 `monitoringConfiguration` 请求的 `start-job-run` 部分，您的日志数据将发送到以下 Amazon S3 位置，如 [使用管理作业运行 AWS CLI](emr-eks-jobs-CLI.md) 所示。
+ 提交者日志-*virtual-cluster-id* ///jobs/ /c *job-id* ontainers/*logUri*/(stderr.gz/ *pod-name* stdout.gz)
+ 驱动程序日志-*virtual-cluster-id* ///jobs/ /containers*logUri*//spark--driver/ (st *job-id* derr.gz/stdout.gz*spark-application-id*) *job-id*
+ 执行者日志-*virtual-cluster-id* ///jobs/ /containers*logUri*///(st *job-id* derr.gz/stdout. *spark-application-id* gz) *executor-pod-name*

# 将任务运行配置为使用 Amazon CloudWatch 日志
<a name="emr-eks-jobs-cloudwatch"></a>

要监控任务进度并排除故障，您必须将任务配置为向 Amazon S3、Amazon Logs 或两者发送 CloudWatch 日志信息。本主题可帮助您开始在 EKS 上使用 Amazon EMR 启动的任务上使用 CloudWatch 日志。有关 CloudWatch 日志的更多信息，请参阅 Amazon CloudWatch 用户指南中的[监控日志文件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatchLogs.html)。

**CloudWatch 日志 IAM 策略**

要将日志数据发送到 CloudWatch 日志，任务执行角色的权限策略中必须包含以下权限。将*my\$1log\$1group\$1name*和*my\$1log\$1stream\$1prefix*，分别替换为 CloudWatch 日志组的名称和日志流名称。如果日志组和日志流式传输不存在，只要执行角色 ARN 具有适当的权限，则 Amazon EMR on EKS 将创建这些日志组和日志流式传输。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogStream",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams"
      ],
      "Resource": [
        "arn:aws:logs:*:*:*"
      ],
      "Sid": "AllowLOGSCreatelogstream"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:PutLogEvents"
      ],
      "Resource": [
        "arn:aws:logs:*:*:log-group:my_log_group_name:log-stream:my_log_stream_prefix/*"
      ],
      "Sid": "AllowLOGSPutlogevents"
    }
  ]
}
```

------

**注意**  
Amazon EMR on EKS 还可以创建日志流。如果日志流不存在，IAM policy 应包含 `"logs:CreateLogGroup"` 权限。

在您为执行角色授予适当的权限后，您的应用程序会在`start-job-run`请求`monitoringConfiguration`部分中传递其 CloudWatch 日志数据时`cloudWatchMonitoringConfiguration`将其日志数据发送到 Logs，如所示[使用管理作业运行 AWS CLI](emr-eks-jobs-CLI.md)。

在 `StartJobRun` API 中，*log\$1group\$1name *是的日志组名称 CloudWatch，*log\$1stream\$1prefix*是的日志流名称前缀 CloudWatch。您可以在 AWS 管理控制台中查看和搜索这些日志。
+ 提交者日志-*virtual-cluster-id* ///jobs*logGroup*//c *job-id* ontainers*logStreamPrefix*//(stderr/ *pod-name* stdout)
+ 驱动程序日志-*virtual-cluster-id* ///jobs*logGroup*//containers*logStreamPrefix*//spark--driv *job-id* er/ (stderrstdout) *spark-application-id* *job-id*
+ 执行者日志-*virtual-cluster-id* ///jobs*logGroup*//containers*logStreamPrefix*///(st *job-id* derr/stdout*spark-application-id*) *executor-pod-name*

## 列出任务运行
<a name="emr-eks-jobs-list"></a>

您可以运行 `list-job-run` 以显示任务运行的状态，如以下示例所示。

```
aws emr-containers list-job-runs --virtual-cluster-id <cluster-id>
```

## 描述任务运行
<a name="emr-eks-jobs-describe"></a>

您可以运行 `describe-job-run` 来获取有关任务的更多详细信息，如任务状态、状态详细信息和任务名称，如以下示例所示。

```
aws emr-containers describe-job-run --virtual-cluster-id cluster-id --id job-run-id
```

## 取消任务运行
<a name="emr-eks-jobs-cancel"></a>

您可以运行 `cancel-job-run` 以取消正在运行的任务，如以下示例所示。

```
aws emr-containers cancel-job-run --virtual-cluster-id cluster-id --id job-run-id
```