

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

# 在 EMR Serverless 中使用应用程序的预初始化容量
<a name="pre-init-capacity"></a>

EMR Serverless 提供了一项可选功能，可使驱动程序和工作线程保持预初始化状态，并在几秒钟内做出响应。这将为应用程序创建一个热工作线程池。此功能称为*预初始化容量*。要配置此功能，请将应用程序的 `initialCapacity` 参数设置为要预初始化的工作线程数。通过预初始化的工作线程容量，作业可立即启动。如果要执行迭代应用程序和时间敏感型作业，这是理想的选择。

预初始化容量可保持一个热工作线程池，随时准备在几秒钟内启动作业和会话。即使应用程序处于空闲状态，您也需要为预置的预初始化工作线程付费，因此我们建议为受益于快速启动时间的用例启用，并调整大小以实现资源的最佳利用。EMR Serverless 应用程序在空闲时自动关闭。我们建议在使用预初始化工作线程时保留此功能，以免产生意外费用。

提交作业时，如果来自 `initialCapacity` 的工作线程可用，作业将使用这些资源开始运行。如果这些工作线程已被其他作业使用，或者如果作业需要的资源多于 `initialCapacity` 中的可用资源，则应用程序会请求并获取额外的工作线程，直到达到为应用程序设置的最大资源限制。作业运行结束时，将会释放其使用的工作线程，应用程序可用的资源数将恢复为 `initialCapacity`。即使在 `initialCapacity` 作业完成运行后，应用程序仍会保留资源。当作业不再需要资源运行时，应用程序会释放 `initialCapacity` 以外的多余资源。

预初始化容量在应用程序启动后即可使用。应用程序停止时，预初始化容量将变为非活动状态。只有在请求的预初始化容量已创建并可供使用时，应用程序才会进入 `STARTED` 状态。在应用程序处于 `STARTED` 状态期间，EMR Serverless 会保留预初始化容量，供作业或交互式工作负载使用。该功能可恢复已释放或故障容器的容量。这样就能保持 `InitialCapacity` 参数指定的工作线程数。没有预初始化容量的应用程序状态可立即从 `CREATED` 变为 `STARTED`。

 您可以对应用程序进行配置，使其在一段时间内未使用时释放预初始化容量，默认值为 15 分钟。提交新作业时，停止的应用程序会自动启动。您可以在创建应用程序时设置这些自动启动和停止配置，也可以在应用程序处于 `CREATED` 或 `STOPPED` 状态时对其进行更改。

您可以更改 `InitialCapacity` 计数，并为每个工作线程指定计算配置，如 CPU、内存和磁盘。由于无法进行部分修改，请在更改值时指定所有计算配置。只有当应用程序处于 `CREATED` 或 `STOPPED` 状态时，才能更改配置。

**注意**  
为了优化应用程序对资源的使用，我们建议将容器大小与预初始化容量工作线程大小保持一致。例如，如果您将 Spark 执行器大小配置为 2CPUs ，将内存配置为 8 GB，但预先初始化的容量工作器大小为 4CPUs ，内存为 16 GB，那么 Spark 执行器在分配给此作业时仅使用一半的工作器资源。

## 为 Spark 和 Hive 自定义预初始化容量
<a name="customizing-capacity"></a>

您可以为在特定大数据框架上运行的工作负载进一步自定义预初始化容量。例如，当工作负载在 Apache Spark 上运行时，请指定有多少个工作线程作为驱动程序启动，有多少个工作线程作为执行程序启动。同样，在使用 Apache Hive 时，请指定有多少个工作线程作为 Hive 驱动程序启动，有多少个工作线程运行 Tez 任务。

**为运行 Apache Hive 的应用程序配置预初始化容量**

以下 API 请求创建了一个基于 Amazon EMR 发行版 emr-6.6.0 运行 Apache Hive 的应用程序。应用程序开始时有 5 个预初始化的 Hive 驱动程序（每个驱动程序有 2 个 vCPU 和 4GB 内存）和 50 个预初始化的 Tez 任务工作线程（每个工作线程有 4 个 vCPU 和 8GB 内存）。当 Hive 查询在此应用程序上运行时，先使用预初始化的工作线程并立即开始执行。如果所有预初始化的工作程序都处于忙碌状态，并且提交了更多的 Hive 作业，则应用程序可以扩展到总计 400 个 vCPU 和 1024GB 内存。您可以选择忽略 `DRIVER` 或 `TEZ_TASK` 工作线程的容量。

```
aws emr-serverless create-application \
  --type "HIVE" \
  --name {{my-application-name}} \
  --release-label emr-6.6.0 \
  --initial-capacity '{
    "DRIVER": {
        "workerCount": 5,
        "workerConfiguration": {
            "cpu": "2vCPU",
            "memory": "4GB"
        }
    },
    "TEZ_TASK": {
        "workerCount": 50,
        "workerConfiguration": {
            "cpu": "4vCPU",
            "memory": "8GB"
        }
    }
  }' \
  --maximum-capacity '{
    "cpu": "400vCPU",
    "memory": "1024GB"
  }'
```

**为运行 Apache Spark 的应用程序配置预初始化容量**

以下 API 请求创建了一个基于 Amazon EMR 发行版 6.6.0 运行 Apache Spark 3.2.0 的应用程序。应用程序开始时有 5 个预初始化的 Spark 驱动程序（每个驱动程序有 2 个 vCPU 和 4GB 内存）和 50 个预初始化的执行程序（每个执行程序有 4 个 vCPU 和 8GB 内存）。当 Spark 作业在此应用程序上运行时，先使用预初始化的工作线程并立即开始执行。如果所有预初始化的工作程序都处于忙碌状态，并且提交了更多的 Spark 作业，则应用程序可以扩展到总计 400 个 vCPU 和 1024GB 内存。您可以选择忽略 `DRIVER` 或 `EXECUTOR` 的容量。

**注意**  
Spark 在驱动程序和执行程序请求的内存中添加了可配置的内存开销（默认值为 10%）。对于使用预初始化工作线程的作业，初始容量内存配置应大于作业和开销请求的内存。

```
aws emr-serverless create-application \
  --type "SPARK" \
  --name {{my-application-name}} \
  --release-label emr-6.6.0 \
  --initial-capacity '{
    "DRIVER": {
        "workerCount": 5,
        "workerConfiguration": {
            "cpu": "2vCPU",
            "memory": "4GB"
        }
    },
    "EXECUTOR": {
        "workerCount": 50,
        "workerConfiguration": {
            "cpu": "4vCPU",
            "memory": "8GB"
        }
    }
  }' \
  --maximum-capacity '{
    "cpu": "400vCPU",
    "memory": "1024GB"
  }'
```