

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

# 实施 Managed Service for Apache Flink 中的应用程序扩展
<a name="how-scaling"></a>

您可以为 Amazon Managed Service for Apache Flink 配置任务并行执行和资源分配以实施扩展。有关 Apache Flink 如何调度任务并行实例的信息，请参阅 Apache Flink 文档中的[并行执行](https://nightlies.apache.org/flink/flink-docs-release-1.19/docs/dev/datastream/execution/parallel/)。

**Topics**
+ [配置应用程序并行度和 KPU ParallelismPer](#how-parallelism)
+ [分配 Kinesis 处理单元](#how-scaling-kpus)
+ [更新应用程序的并行度](#how-scaling-howto)
+ [在 Managed Service for Apache Flink 中使用自动扩展](how-scaling-auto.md)
+ [MaxParlelism 注意事项](#how-scaling-auto-max-parallelism)

## 配置应用程序并行度和 KPU ParallelismPer
<a name="how-parallelism"></a>

您可以使用以下[https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_ApplicationConfiguration.html](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_ApplicationConfiguration.html)属性为 Managed Service for Apache Flink 应用程序任务（例如从源读取或执行运算符）配置并行执行：
+ `Parallelism` — 使用该属性设置默认 Apache Flink 应用程序并行度。所有操作符、源和接收器以该并行度执行，除非在应用程序代码中覆盖它们。默认值为 `1`，最大值为 `256`。
+ `ParallelismPerKPU` — 使用此属性可设置应用程序的每个 Kinesis 处理单元 (KPU) 可以计划的并行任务数。默认值为 `1`，最大值为 `8`。对于具有阻止操作（例如，I/O）的应用程序，较高的 `ParallelismPerKPU` 值导致完全使用 KPU 资源。

**注意**  
的限制等`Parallelism`于限制的`ParallelismPerKPU`乘积 KPUs （默认值为 64）。可以通过请求提高 KPUs 限额来提高限额。有关如何请求增加限制的说明，请参阅 [ 服务限额](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html)中的“请求增加限制”。

有关为特定运算符设置任务并行度的信息，请参阅 Apache Flink 文档中的[设置并行度：运算符。](https://nightlies.apache.org/flink/flink-docs-release-1.19/docs/dev/datastream/execution/parallel/#operator-level)

## 分配 Kinesis 处理单元
<a name="how-scaling-kpus"></a>

适用于 Apache Flink 的托管服务将容量配置为。 KPUs一个 KPU 可为您提供 1 个 vCPU 和 4 GB 内存。对于分配的每个 KPU，还提供了 50 GB 运行的应用程序存储。

适用于 Apache Flink KPUs 的托管服务使用`Parallelism`和`ParallelismPerKPU`属性计算运行应用程序所需的资源，如下所示：

```
Allocated KPUs for the application = Parallelism/ParallelismPerKPU
```

Managed Service for Apache Flink 快速为应用程序提供资源，以应对出现的吞吐量或处理活动高峰。在活动高峰过后，它逐渐从应用程序中删除资源。要禁止自动分配资源，请将 `AutoScalingEnabled` 值设置为 `false`，如后面的[更新应用程序的并行度](#how-scaling-howto)中所述。

您的应用程序 KPUs 的默认限制为 64。有关如何请求增加限制的说明，请参阅 [ 服务限额](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html)中的“请求增加限制”。

**注意**  
出于编排目的，需要额外收取 KPU 费用。有关更多信息，请参阅 [Managed Service for Apache Flink 定价](https://aws.amazon.com/kinesis/data-analytics/pricing/)。

## 更新应用程序的并行度
<a name="how-scaling-howto"></a>

本节包含设置应用程序并行度的 API 操作的示例请求。有关如何将请求块与 API 操作一起使用的更多示例和说明，请参阅[Managed Service for Apache Flink API 示例代码](api-examples.md)。

[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 操作的以下示例请求在您创建应用程序时设置并行度：

```
{
   "ApplicationName": "string",
   "RuntimeEnvironment":"FLINK-1_18",
   "ServiceExecutionRole":"arn:aws:iam::123456789123:role/myrole",
   "ApplicationConfiguration": { 
      "ApplicationCodeConfiguration":{
      "CodeContent":{
         "S3ContentLocation":{
            "BucketARN":"arn:aws:s3:::amzn-s3-demo-bucket",
            "FileKey":"myflink.jar",
            "ObjectVersion":"AbCdEfGhIjKlMnOpQrStUvWxYz12345"
            }
         },
      "CodeContentType":"ZIPFILE"
   },   
      "FlinkApplicationConfiguration": { 
         "ParallelismConfiguration": { 
            "AutoScalingEnabled": "true",
            "ConfigurationType": "CUSTOM",
            "Parallelism": 4,
            "ParallelismPerKPU": 4
         }
      }
   }
}
```

[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 操作的以下示例请求为现有的应用程序设置并行度：

```
{
   "ApplicationName": "MyApplication",
   "CurrentApplicationVersionId": 4,
   "ApplicationConfigurationUpdate": { 
      "FlinkApplicationConfigurationUpdate": { 
         "ParallelismConfigurationUpdate": { 
            "AutoScalingEnabledUpdate": "true",
            "ConfigurationTypeUpdate": "CUSTOM",
            "ParallelismPerKPUUpdate": 4,
            "ParallelismUpdate": 4
         }
      }
   }
}
```

[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 操作的以下示例请求为现有的应用程序禁用并行度：

```
{
   "ApplicationName": "MyApplication",
   "CurrentApplicationVersionId": 4,
   "ApplicationConfigurationUpdate": { 
      "FlinkApplicationConfigurationUpdate": { 
         "ParallelismConfigurationUpdate": { 
            "AutoScalingEnabledUpdate": "false"
         }
      }
   }
}
```

# 在 Managed Service for Apache Flink 中使用自动扩展
<a name="how-scaling-auto"></a>

Managed Service for Apache Flink 可以弹性地扩展应用程序的并行度，以适应大多数情况下源的数据吞吐量和操作员的复杂性。默认情况下，将会启用自动扩展。Managed Service for Apache Flink 监控应用程序的资源 (CPU) 使用情况，并相应地弹性地向上或向下扩展应用程序的并行度：
+ 如果 CloudWatch 指标最大值在 15 分钟内大于 75% 或以上，`containerCPUUtilization`则您的应用程序会向上扩展（增加并行度）。这意味着，当连续有 15 个数据点，其中 1 分钟周期等于或大于 75% 时，就会启动 `ScaleUp` 操作。`ScaleUp` 操作将应用程序的 `CurrentParallelism` 翻倍。 `ParallelismPerKPU` 未修改。结果，分配的数量 KPUs 也翻了一番。
+ 当 CPU 使用率在六小时内保持在 10% 以下时，您的应用程序会缩小规模（降低并行度）。这意味着当 360 个连续数据点的 1 分钟周期小于 10% 时，就会启动 `ScaleDown` 操作。`ScaleDown`操作将应用程序的并行度减半（四舍五入）。 `ParallelismPerKPU`未修改，分配的数量 KPUs 也减半（向上舍入）。

**注意**  
可以引用最长 `containerCPUUtilization` 超过 1 分钟的时间段来查找与用于缩放操作的数据点的相关性，但没有必要反映启动操作的确切时刻。

Managed Service for Apache Flink 不会将应用程序的`CurrentParallelism`价值降低到低于应用程序设置的`Parallelism`值。

当 Managed Service for Apache Flink 正在扩展您的应用程序时，它将处于状态。`AUTOSCALING`您可以使用[ DescribeApplication](https://docs.aws.amazon.com//managed-flink/latest/apiv2/API_DescribeApplication.html)或[ ListApplications](https://docs.aws.amazon.com//managed-flink/latest/apiv2/API_ListApplications.html)操作检查当前的应用程序状态。当服务扩展您的应用程序时，您可以使用的唯一有效 API 操作是[ StopApplication](https://docs.aws.amazon.com//managed-flink/latest/apiv2/API_ListApplications.html)将`Force`参数设置为`true`。

您可以使用 `AutoScalingEnabled` 属性（[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_FlinkApplicationConfiguration.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_FlinkApplicationConfiguration.html) 的一部分）启用或禁用自动扩展行为。您的 AWS 账户将按照 Apache Flink 提供的托管服务收费，这取决于您的应用程序`parallelism`和`parallelismPerKPU`设置。 KPUs 活动激增会增加您的 Managed Service for Apache Flink 费用。

有关定价的更多信息，请参阅[Amazon Managed Service for Apache Flink 定价](https://aws.amazon.com/kinesis/data-analytics/pricing/)。

请注意有关应用程序扩展的以下内容：
+ 默认情况下，将会启用自动扩展。
+ 伸缩不适用于 Studio 笔记本。但是，如果您将 Studio 笔记本部署为具有持久状态的应用程序，则伸缩将适用于已部署的应用程序。
+ 您的应用程序的默认限制为 64 KPUs。有关更多信息，请参阅 [Managed Service for Apache Flink 与 Studio 笔记本配额](limits.md)。
+ 在自动扩展更新应用程序并行度时，应用程序将会发生停机。为了避免这种停机，请执行以下操作：
  + 禁用自动扩展
  + 使用[UpdateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html)操作配置您的应用程序`parallelism`和`parallelismPerKPU`。有关设置应用程序的并行度设置的更多信息，请参阅 [更新应用程序的并行度](how-scaling.md#how-scaling-howto)。
  + 定期监控应用程序的资源使用情况，以验证应用程序是否具有适合其工作负载的并行度设置。有关监控分配资源使用情况的信息，请参阅[Managed Service for Apache Flink 中的指标和维度](metrics-dimensions.md)。

## 实施自定义自动扩展
<a name="how-scaling-custom-autoscaling"></a>

如果您想对自动扩展进行更精细的控制或使用 `containerCPUUtilization` 之外的触发指标，则可以使用以下示例：
+ [AutoScaling](https://github.com/aws-samples/amazon-managed-service-for-apache-flink-examples/tree/main/infrastructure/AutoScaling)

  此示例说明了如何使用与 Apache Flink 应用程序不同的 CloudWatch 指标（包括来自亚马逊 MSK 和 Amazon Kinesis Data Streams 的指标，用作源或接收器）来扩展适用于 Apache Flink 的托管服务 Flink 应用程序。

有关更多信息，请参阅 [Apache Flink 的增强监控和自动扩展](https://aws.amazon.com/blogs/big-data/enhanced-monitoring-and-automatic-scaling-for-apache-flink/)。

## 实施计划的自动扩展
<a name="how-scaling-scheduled-autoscaling"></a>

如果您的工作负载随时间推移呈现可预测的趋势，您可能更倾向于预先扩展您的 Apache Flink 应用程序。这会按计划的时间扩展您的应用程序，而不是根据指标进行被动扩展。要设置在一天中的固定时间纵向扩展和缩减，可以使用以下示例：
+ [ScheduledScaling](https://github.com/aws-samples/amazon-managed-service-for-apache-flink-examples/tree/main/infrastructure/ScheduledScaling)

## MaxParlelism 注意事项
<a name="how-scaling-auto-max-parallelism"></a>

Flink 作业可扩展的最大并行度受限于该作业所有运算符的*最小* `maxParallelism`。例如，如果您有一个简单的作业，其中只有一个源和一个接收器，并且源有值为 16 的 `maxParallelism`，接收器有 8，那么应用程序就无法扩展到 8 以上的并行度。

要了解如何计算运算符的默认 `maxParallelism` 以及如何覆盖默认值，请参阅 Apache Flink 文档中的[设置最大并行度](https://nightlies.apache.org/flink/flink-docs-release-1.19/docs/dev/datastream/execution/parallel/#setting-the-maximum-parallelism)。

作为基本规则，请注意，如果您没有为任何运算符定义 `maxParallelism`，并且在启动应用程序时并行度小于或等于 128，则所有运算符都将具有 128 的 `maxParallelism`。

**注意**  
作业的最大并行度是扩展应用程序时保持状态的并行度上限。  
如果您修改现有应用程序的 `maxParallelism`，则该应用程序将无法从以前使用 `maxParallelism` 创建的旧快照重新启动。您只能在没有快照的情况下重新启动应用程序。  
如果您计划将应用程序扩展到大于 128 的并行度，则必须在应用程序中明确设置 `maxParallelism`。
+ 自动扩展逻辑可以防止将 Flink 作业的并行度扩展到超过该作业的最大并行度。
+ 如果您使用自定义自动扩展或计划扩展，请对其进行配置，使其不会超过作业的最大并行度。
+ 如果您手动将应用程序扩展到超出最大并行度，则应用程序将无法启动。