性能最佳实践 - Amazon Kinesis Data Analytics
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

性能最佳实践

本节介绍为提高性能而设计应用程序时的特殊注意事项。

正确管理扩缩

本节包含有关管理应用程序级和操作员级扩展的信息。

正确管理应用程序扩展

您可以使用自动缩放来处理应用程序活动中的意外峰值。如果满足以下条件,则应用程序的 KPU 将自动增加:

  • 已为应用程序启用自动缩放。

  • CPU 使用率在 15 分钟内保持在 75% 以上。

如果启用了自动缩放,但 CPU 使用率未保持在此阈值,则应用程序将无法扩展 KPU。如果您遇到 CPU 使用率峰值未达到此阈值,或者遇到其他使用率指标(例如)的峰值heapMemoryUtilization,请手动增加扩展能力,让您的应用程序能够应对活动峰值。

注意

如果应用程序通过 Auto Scaling 自动添加了更多资源,则该应用程序将在一段时间不活动后释放新资源。缩减资源将暂时影响性能。

有关扩展的更多信息,请参阅扩缩 生产准备就绪

正确管理操作员扩展

您可以通过验证应用程序的工作负载在工作进程之间均匀分布,以及应用程序中的操作员是否拥有保持稳定和高性能所需的系统资源,来提高应用程序的性能。

您可以使用设置为应用程序代码中的每个运算符parallelism设置并行度。如果您不为运算符设置并行度,它将使用应用程序级并行度设置。使用应用程序级并行度设置的操作员可能会使用应用程序的所有可用系统资源,从而使应用程序变得不稳定。

为了最好地确定每个运算符的并行度,请考虑该运算符与应用程序中其他运算符相比的相对资源需求。将资源密集度更高的运算符设置为比资源密集度较低的运算符更高的运算符并行度设置。

应用程序的总运算符并行度是应用程序中所有运算符的并行度之和。您可以通过确定应用程序与可用于应用程序的任务槽总数之间的最佳比率来调整应用程序的总操作员并行度。操作员总并行度与任务槽的典型稳定比率为 4:1,也就是说,应用程序每四个可用的操作员子任务就有一个任务槽可用。具有更多资源密集型运算符的应用程序可能需要的比率为 3:1 或 2:1,而具有资源密集度较低的运算符的应用程序可能以 10:1 的比率保持稳定。

您可以使用设置运算符的比率运行时属性,因此无需编译和上传应用程序代码即可调整运算符的并行度。

下面的代码示例演示了如何将运算符并行度设置为当前应用程序并行度的可调比率:

Map<String, Properties> applicationProperties = KinesisAnalyticsRuntime.getApplicationProperties(); operatorParallelism = StreamExecutionEnvironment.getParallelism() / Integer.getInteger( applicationProperties.get("OperatorProperties").getProperty("MyOperatorParallelismRatio") );

有关子任务、任务槽和其他应用程序资源的信息,请参阅应用程序资源

要控制应用程序工作进程之间工作负载的分配,请使用Parallelism设置和KeyBy分区方法。有关更多信息,请参阅 Apache Flink 文档中的以下主题:

监控外部依赖资源使用情况

如果目的地(例如 Kinesis Streams、Kinesis Data Firehose、DynamoDB 或 OpenSearch 服务)存在性能瓶颈,您的应用程序将面临背压。验证是否已为应用程序吞吐量正确配置了外部依赖项。

注意

其他服务中的故障可能会导致您的应用程序出现故障。如果您发现应用程序出现故障,请检查目标服务的 CloudWatch 日志中是否存在故障。

在本地运行你的 Apache Flink 应用程序

要解决内存问题,你可以在本地 Flink 安装中运行应用程序。这将允许您访问调试工具,例如堆栈跟踪和堆转储,这些工具在 Kinesis Data Analytics 中运行应用程序时不可用。

有关创建本地 Flink 安装的信息,请参阅 Apache Flink 文档中的本地安装教程