

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

# 从这里开始 AWS CLI
<a name="gs-cli"></a>

使用创建应用程序、运行作业、检查作业运行输出和删除资源的命令开始 AWS CLI 使用 EMR Serverless。

## 步骤 1：创建 EMR Serverless 应用程序
<a name="gs-application-cli"></a>

使用 [https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_CreateApplication.html](https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_CreateApplication.html) 命令创建您的第一个 EMR Serverless 应用程序。您需要指定应用程序类型，以及与要使用的应用程序版本关联的 Amazon EMR 发行版标签。应用程序的名称为可选。

------
#### [ Spark ]

要创建 Spark 应用程序，请运行以下命令。

```
aws emr-serverless create-application \
    --release-label emr-6.6.0 \
    --type "SPARK" \
    --name my-application
```

------
#### [ Hive ]

要创建 Hive 应用程序，请运行以下命令。

```
aws emr-serverless create-application \
    --release-label emr-6.6.0 \
    --type "HIVE" \
    --name my-application
```

------

记下输出中返回的应用程序 ID。您将在启动应用程序和提交作业时使用该 ID，后面称为 `application-id`。

在继续学习 `CREATED` 之前，请确保您的应用程序已使用 [https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_GetApplication.html](https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_GetApplication.html) API 达到 [步骤 2：将作业运行提交到 EMR Serverless 应用程序](#gs-job-run-cli) 状态。

```
aws emr-serverless get-application \
    --application-id application-id
```

EMR Serverless 会创建工作线程来容纳您请求的作业。默认情况下，这些是按需创建的，但您也可以在创建应用程序时通过设置 `initialCapacity` 参数来指定预初始化容量。您还可以使用 `maximumCapacity` 参数来限制应用程序可以使用的最大总容量。要了解有关这些选项的更多信息，请参阅 [使用 EMR Serverless 时配置应用程序](application-capacity.md)。

## 步骤 2：将作业运行提交到 EMR Serverless 应用程序
<a name="gs-job-run-cli"></a>

现在，您的 EMR Serverless 应用程序已准备好运行作业。

------
#### [ Spark ]

在此步骤中，我们使用 PySpark 脚本来计算多个文本文件中唯一单词的出现次数。公有的只读 S3 存储桶可同时存储脚本和数据集。应用程序将 Spark 运行时中的输出文件和日志数据发送到您创建的 S3 存储桶中的 `/output` 和 `/logs` 目录。

**运行 Spark 作业**

1. 使用以下命令将我们要运行的示例脚本复制到您的新存储桶。

   ```
   aws s3 cp s3://us-east-1.elasticmapreduce/emr-containers/samples/wordcount/scripts/wordcount.py s3://amzn-s3-demo-bucket/scripts/
   ```

1. 在以下命令中，将 `application-id` 替换为您的应用程序 ID。将 `job-role-arn` 替换为您在 [创建作业运行时角色](getting-started.md#gs-runtime-role) 中创建的运行时角色 ARN。将 *`job-run-name`* 替换为您要调用的作业运行名称。将所有 `amzn-s3-demo-bucket` 字符串替换为您创建的 Amazon S3 存储桶，然后将 `/output` 添加到路径中。这将在您的存储桶中创建一个新文件夹，EMR Serverless 可以在其中复制应用程序的输出文件。

   ```
   aws emr-serverless start-job-run \
       --application-id application-id \
       --execution-role-arn job-role-arn \
       --name job-run-name \
       --job-driver '{
           "sparkSubmit": {
             "entryPoint": "s3://amzn-s3-demo-bucket/scripts/wordcount.py",
             "entryPointArguments": ["s3://amzn-s3-demo-bucket/emr-serverless-spark/output"],
             "sparkSubmitParameters": "--conf spark.executor.cores=1 --conf spark.executor.memory=4g --conf spark.driver.cores=1 --conf spark.driver.memory=4g --conf spark.executor.instances=1"
           }
       }'
   ```

1. 记下输出中返回的作业运行 ID。在以下步骤中将 `job-run-id` 替换为此 ID。

------
#### [ Hive ]

在本教程中，我们将创建一个表，插入几条记录，然后运行计数聚合查询。要运行 Hive 作业，先创建一个包含所有要作为单个作业的一部分运行的 Hive 查询的文件，将该文件上传到 S3，然后在启动 Hive 作业时指定此 S3 路径。

**运行 Hive 作业**

1. 创建一个名为 `hive-query.ql` 的文件，其中包含您要在 Hive 作业中运行的所有查询。

   ```
   create database if not exists emrserverless;
   use emrserverless;
   create table if not exists test_table(id int);
   drop table if exists Values__Tmp__Table__1;
   insert into test_table values (1),(2),(2),(3),(3),(3);
   select id, count(id) from test_table group by id order by id desc;
   ```

1. 使用以下命令将 `hive-query.ql` 上传到 S3 存储桶。

   ```
   aws s3 cp hive-query.ql s3://amzn-s3-demo-bucket/emr-serverless-hive/query/hive-query.ql
   ```

1. 在以下命令中，将 `application-id` 替换为您自己的应用程序 ID。将 `job-role-arn` 替换为您在 [创建作业运行时角色](getting-started.md#gs-runtime-role) 中创建的运行时角色 ARN。将所有 `amzn-s3-demo-bucket` 字符串替换为您创建的 Amazon S3 存储桶，然后将 `/output` 和 `/logs` 添加到路径中。这将在您的存储桶中创建的新文件夹，EMR Serverless 可以在其中复制应用程序的输出和日志文件。

   ```
   aws emr-serverless start-job-run \
       --application-id application-id \
       --execution-role-arn job-role-arn \
       --job-driver '{
           "hive": {
             "query": "s3://amzn-s3-demo-bucket/emr-serverless-hive/query/hive-query.ql",
             "parameters": "--hiveconf hive.log.explain.output=false"
           }
       }' \
       --configuration-overrides '{
         "applicationConfiguration": [{
           "classification": "hive-site",
             "properties": {
               "hive.exec.scratchdir": "s3://amzn-s3-demo-bucket/emr-serverless-hive/hive/scratch",
               "hive.metastore.warehouse.dir": "s3://amzn-s3-demo-bucket/emr-serverless-hive/hive/warehouse",
               "hive.driver.cores": "2",
               "hive.driver.memory": "4g",
               "hive.tez.container.size": "4096",
               "hive.tez.cpu.vcores": "1"
               }
           }],
           "monitoringConfiguration": {
             "s3MonitoringConfiguration": {
               "logUri": "s3://amzn-s3-demo-bucket/emr-serverless-hive/logs"
              }
           }
       }'
   ```

1. 记下输出中返回的作业运行 ID。在以下步骤中将 `job-run-id` 替换为此 ID。

------

## 步骤 3：查看作业运行的输出
<a name="gs-output-cli"></a>

作业运行通常需要 3-5 分钟才能完成。

------
#### [ Spark ]

您可以使用以下命令检查 Spark 作业的状态。

```
aws emr-serverless get-job-run \
    --application-id application-id \
    --job-run-id job-run-id
```

将日志目标设置为 `s3://amzn-s3-demo-bucket/emr-serverless-spark/logs`，可在 `s3://amzn-s3-demo-bucket/emr-serverless-spark/logs/applications/application-id/jobs/job-run-id` 下方找到特定作业的日志。

对于 Spark 应用程序，EMR Serverless 每 30 秒将事件日志推送到 S3 日志目标中的 `sparklogs` 文件夹。作业完成后，驱动程序和执行程序的 Spark 运行时日志会上传到按工作线程类型适当命名的文件夹，例如 `driver` 或 `executor`。 PySpark 作业的输出将上传到。`s3://amzn-s3-demo-bucket/output/`

------
#### [ Hive ]

您可以使用以下命令检查 Hive 作业的状态。

```
aws emr-serverless get-job-run \
    --application-id application-id \
    --job-run-id job-run-id
```

将日志目标设置为 `s3://amzn-s3-demo-bucket/emr-serverless-hive/logs`，可在 `s3://amzn-s3-demo-bucket/emr-serverless-hive/logs/applications/application-id/jobs/job-run-id` 下方找到特定作业的日志。

对于 Hive 应用程序，EMR Serverless 会持续将 Hive 驱动程序上传到 S3 日志目标的 `HIVE_DRIVER` 文件夹，并将 Tez 任务日志上传到 `TEZ_TASK` 文件夹。作业运行达到 `SUCCEEDED` 状态后，Hive 查询的输出将出现在您在 `configurationOverrides` 的 `monitoringConfiguration` 字段中指定的 Amazon S3 位置。

------

## 步骤 4：清除
<a name="gs-cleanup-cli"></a>

本教程学习结束后，请考虑删除创建的资源。建议您释放不打算再次使用的资源。

### 删除应用程序
<a name="delete-application-cli"></a>

要删除应用程序，请使用以下命令。

```
aws emr-serverless delete-application \
    --application-id application-id
```

### 删除 S3 日志存储桶
<a name="delete-s3-bucket-cli"></a>

要删除 S3 日志记录和输出存储桶，请使用以下命令。将 `amzn-s3-demo-bucket` 替换为您在 [准备 EMR Serverless 存储](getting-started.md#gs-prepare-storage) 中创建的 S3 存储桶的实际名称。

```
aws s3 rm s3://amzn-s3-demo-bucket --recursive
aws s3api delete-bucket --bucket amzn-s3-demo-bucket
```

### 删除作业运行时角色
<a name="delete-runtime-role-cli"></a>

要删除运行时角色，请将策略与角色分离。然后，就可以删除角色和策略。

```
aws iam detach-role-policy \
    --role-name EMRServerlessS3RuntimeRole \
    --policy-arn policy-arn
```

要删除角色，请使用以下命令。

```
aws iam delete-role \
    --role-name EMRServerlessS3RuntimeRole
```

要删除附加到角色的策略，请使用以下命令。

```
aws iam delete-policy \
    --policy-arn policy-arn
```

有关运行 Spark 和 Hive 作业的更多示例，请参阅 [运行 EMR Serverless 作业时使用 Spark 配置](jobs-spark.md) 和 [运行 EMR Serverless 作业时使用 Hive 配置](jobs-hive.md)。