应用程序正在重新启动 - Managed Service for Apache Flink
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon Managed Service for Apache Flink 之前称为 Amazon Kinesis Data Analytics for Apache Flink。

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

应用程序正在重新启动

如果您的应用程序运行状况不佳,则其 Apache Flink 任务会持续失败并重新启动。本节介绍这种情况的症状和故障排除步骤。

症状

这种情况可能具有以下症状:

  • FullRestarts指标不为零。此指标表示自您启动应用程序以来应用程序任务重新启动的次数。

  • Downtime指标不为零。此指标表示应用程序处于FAILINGRESTARTING状态的毫秒数。

  • 应用程序日志包含对RESTARTINGFAILED的状态更改。您可以使用以下 Logs Insights 查询来查询应用程序 CloudWatch 日志以了解这些状态变化:分析错误:与应用程序任务相关的故障.

原因和解决方案

以下情况可能会导致您的应用程序变得不稳定并反复重启:

  • 操作员抛出异常:如果应用程序中某个运算符中的任何异常未得到处理,则应用程序会进行故障转移(通过解释操作员无法处理失败)。应用程序从最新的检查点重新启动,以保持“精确一次”的处理语义。因此,Downtime在这些重启期间不为零。为了防止发生这种情况,我们建议您在应用程序代码中处理任何可重试的异常。

    您可以查询应用程序日志以确定应用程序状态是否从 RUNNING 变为 FAILED,以调查发生这种情况的原因。有关更多信息,请参阅 分析错误:与应用程序任务相关的故障

  • 未正确配置 Kinesis 数据流:如果您的应用程序的源或接收器是 Kinesis 数据流,请检查流的指标是否存在错误或错误。ReadProvisionedThroughputExceeded WriteProvisionedThroughputExceeded

    如果您看到这些错误,则可以通过增加 Kinesis 流的分片数量来增加 Kinesis 流的可用吞吐量。有关重新分片的更多信息,请参阅如何更改 Kinesis Data Streams 中打开的分片数?

  • 其他源或接收器未正确配置或不可用:验证您的应用程序是否正确配置了源和接收器。检查应用程序中使用的任何源或接收器(例如其他 Amazon 服务、外部源或目标)是否配置良好,没有遇到读取或写入限制,或者定期不可用。

    如果您的依赖服务遇到吞吐量相关的问题,请增加这些服务的可用资源,或者调查任何错误或不可用的原因。

  • 未正确配置运算符:如果应用程序中其中一个运算符的线程上的工作负载分配不正确,则该运算符可能会过载,应用程序可能会崩溃。有关调整运算符并行度的信息,请参见。正确管理运算符扩展

  • 应用程序失败 DaemonException:如果您使用的是 1.11 之前的 Apache Flink 版本,则此错误会出现在应用程序日志中。您可能需要升级到更高版本的 Apache Flink,这样才能使用 0.14 或更高版本的 KPL。

  • 应用程序失败 TimeoutException,并出现 FlinkException、或 RemoteTransportException:如果任务管理器崩溃,这些错误可能会出现在应用程序日志中。如果您的应用程序过载,您的任务管理器可能会承受 CPU 或内存资源压力,从而导致它们失败。

    这些错误可能与以下内容相似:

    • java.util.concurrent.TimeoutException: The heartbeat of JobManager with id xxx timed out

    • org.apache.flink.util.FlinkException: The assigned slot xxx was removed

    • org.apache.flink.runtime.io.network.netty.exception.RemoteTransportException: Connection unexpectedly closed by remote task manager

    要排查 App 的问题,请检查以下内容:

    • 检查您的 CloudWatch 指标,看看 CPU 或内存使用率是否出现异常峰值。

    • 检查您的应用程序是否存在吞吐量问题。有关更多信息,请参阅 对性能问题进行故障排除

    • 检查您的应用程序日志,了解您的应用程序代码引发的未处理异常。

  • 应用程序失败并出现 “ JaxbAnnotationModule 未找到” 错误:如果您的应用程序使用 Apache Beam,但没有正确的依赖项或依赖项版本,则会发生此错误。使用 Apache Beam 的 Managed Service for Apache Flink 应用程序必须使用以下版本的依赖关系:

    <jackson.version>2.10.2</jackson.version> ... <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-jaxb-annotations</artifactId> <version>2.10.2</version> </dependency>

    如果您没有提供正确的版本jackson-module-jaxb-annotations作为显式依赖项,则您的应用程序会从环境依赖项中加载该版本,并且由于版本不匹配,应用程序会在运行时崩溃。

    有关将 Apache Beam 与 Managed Service for Apache Flink结合使用的更多信息,请参阅 CloudFormation 与适用于 Apache Flink 的托管服务一起使用

  • 应用程序因为 java.io.ioException 而失败:网络缓冲区数量不足

    当应用程序没有为网络缓冲区分配足够的内存时,就会发生这种情况。网络缓冲区便于子任务之间的通信。它们用于在通过网络传输之前存储记录,也用于存储传入的数据,然后再将其解析成记录并交给子任务。所需的网络缓冲区数量直接随着任务图的并行度和复杂性而变化。有多种方法可以缓解此问题:

    • 您可以配置较低的配置,parallelismPerKpu以便为每个子任务和网络缓冲区分配更多的内存。请注意,降低parallelismPerKpu会增加 KPU,从而增加成本。为避免这种情况,您可以通过将并行度降低相同的系数来保持相同数量的 KPU。

    • 您可以通过减少运算符的数量或链接运算符来简化任务图,从而减少所需的缓冲区。

    • 否则,您可以联系 https://aws.amazon.com/premiumsupport/ 获取自定义网络缓冲区配置。