本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Apache Flink 的 Kinesis Data Analytics 的最佳实践
本节包含有关开发稳定、高性能 Amazon Kinesis Data Analytics 应用程序的信息和建议。
容错能力:检查点和保存点
使用检查点和保存点在适用于 Apache Flink 的 Kinesis Data Analytics 应用程序中实施容错功能。在开发和维护应用程序时,请牢记以下几点:
我们建议您为应用程序启用检查点。检查点可以在计划维护期间以及在由于服务问题、应用程序依赖项故障和其他问题而导致意外故障的情况下,检查点为应用程序提供容错功能。有关计划维护的信息,请参阅针对 Apache Flink 维护的 Kinesis Data Analytics.
在应用程序开发或故障排除期间,将 ApplicationSnapshotConfiguration::SnapshotsEnabled 设置为
false
。在每次应用程序停止期间,将会创建一个快照;如果应用程序处于不正常状态或性能不佳,则可能会出现问题。在应用程序处于生产状态并保持稳定后,将SnapshotsEnabled
设置为true
。注意 我们建议应用程序每天创建几次快照以使用正确的状态数据正确地重新启动。快照的正确频率取决于应用程序的业务逻辑。通过频繁拍摄快照,您可以恢复更新的数据,但会增加成本并需要更多系统资源。
有关监控应用程序停机时间的信息,请参阅指标与维度。
有关实施容错功能的更多信息,请参阅容错能力。
性能和并行度
应用程序可以调整应用程序并行度并避免性能陷阱,从而进行扩展以满足任何吞吐量级别要求。在开发和维护应用程序时,请牢记以下几点:
验证是否充分预置了所有应用程序源和接收器,而不会受到限制。如果源和接收器是其他Amazon使用监控这些服务,CloudWatch.
对于并行度较高的应用程序,请检查是否将较高的并行度应用于应用程序中的所有操作符。默认情况下,Apache Flink 为应用程序图中的所有操作符应用相同的应用程序并行度。这可能会导致在源或接收器上出现预置问题,或者出现操作符数据处理瓶颈。您可以使用 setParallelism
更改代码中的每个操作符的并行度。 了解应用程序中的操作符的并行度设置的含义。如果更改操作符的并行度,您可能无法从操作符并行度与当前设置不兼容时创建的快照中还原应用程序。有关设置运算符并行度的更多信息,请参阅明确设置运算符的最大并行度
.
有关实施扩展的更多信息,请参阅扩展。
日志记录
您可以使用监控应用程序的性能和错误情况 CloudWatch 日志。为应用程序配置日志记录时,请牢记以下几点:
启用 CloudWatch 为应用程序进行日志记录,以便可以调试任何运行时问题。
不要为应用程序中处理的每条记录创建一个日志条目。这会在处理期间出现严重瓶颈,并且可能会导致数据处理反向压力。
Create CloudWatch 警报用于在应用程序运行不正常时通知您。有关更多信息,请参阅 。告警
有关实施日志记录的更多信息,请参阅日志记录和监控。
编码
您可以使用建议的编程做法以提高应用程序性能和稳定性。在编写应用程序代码时,请牢记以下几点:
不要在应用程序代码(应用程序的
main
方法或用户定义的函数)中使用system.exit()
。如果要从代码中关闭应用程序,请引发一个从Exception
或RuntimeException
派生的异常,其中包含有关应用程序出现的错误的消息。请注意下面有关该服务如何处理此类异常的信息:
如果从你的应用程序抛出异常
main
方法,该服务会将其包装在ProgramInvocationException
当应用程序过渡到RUNNING
状态,作业经理将无法提交作业。如果异常是从用户定义的函数中引发的,作业管理器使作业失败并重新启动,并将异常详细信息写入到异常日志中。
请考虑为应用程序 JAR 文件及其包含的依赖项填充阴影。如果应用程序和 Apache Flink 运行时的程序包名称存在潜在的冲突,则建议填充阴影。如果发生冲突,则应用程序日志可能包含
java.util.concurrent.ExecutionException
类型的异常。有关为应用程序 JAR 文件填充阴影的更多信息,请参阅 Apache Maven Shade 插件。
更新间隔 Studio 笔记本
如果更改段落结果刷新间隔,请将其设置为至少 1000 毫秒的值。
最佳性能 Studio 笔记本
我们用以下陈述进行了测试,当时获得了最好的性能events-per-second
乘以number-of-keys
年龄在 25,000,000 以下。这是为了events-per-second
15 万以下。
SELECT key, sum(value) FROM key-values GROUP BY key