

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

# 应用程序正在重新启动
<a name="troubleshooting-rt-restarts"></a>

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

## 症状
<a name="troubleshooting-rt-restarts-symptoms"></a>

这种情况可能具有以下症状：
+ 该 `FullRestarts` 指标不为零。此指标表示自您启动应用程序以来应用程序任务重新启动的次数。
+ 该 `Downtime` 指标不为零。此指标表示应用程序处于 `FAILING` 或 `RESTARTING` 状态的毫秒数。
+ 应用程序日志包含对 `RESTARTING` 或 `FAILED` 的状态更改。您可以使用以下 Logs Insights 查询来查询应用程序 CloudWatch 日志以了解这些状态变化:[分析错误：应用程序的任务相关故障](cloudwatch-logs-reading.md#cloudwatch-logs-reading-apps).

## 原因和解决方案
<a name="troubleshooting-rt-restarts-causes"></a>

以下情况可能会导致您的应用程序变得不稳定并反复重启：
+ **运算符抛出异常：**如果应用程序中的运算符中的任何异常未得到处理，则应用程序会（解读为运算符无法处理故障）进行故障转移。应用程序从最新的检查点重新启动，以保持“只执行一次”的处理语义。因此，`Downtime` 在这些重启期间不为零。为了防止发生这种情况，我们建议您在应用程序代码中处理任何可重试的异常。

  您可以查询应用程序日志以确定应用程序状态是否从 `RUNNING` 变为 `FAILED`，以调查发生这种情况的原因。有关更多信息，请参阅 [分析错误：应用程序的任务相关故障](cloudwatch-logs-reading.md#cloudwatch-logs-reading-apps)。
+ **未正确配置 Kinesis Data Streams：**如果您的应用程序的源或接收器是 Kinesis 数据流，请检查该流的[指标](https://docs.aws.amazon.com/streams/latest/dev/monitoring-with-cloudwatch.html)是否存在 `ReadProvisionedThroughputExceeded` 或 `WriteProvisionedThroughputExceeded` 错误。

  如果您看到这些错误，则可以通过增加 Kinesis 流的分片数量来增加 Kinesis 流的可用吞吐量。有关重新分片的更多信息，请参阅[如何更改 Kinesis Data Streams 中打开的分片数？](https://aws.amazon.com/premiumsupport/knowledge-center/kinesis-data-streams-open-shards/)
+ **其他源或接收器未正确配置或不可用：**验证您的应用程序是否正确配置了源和接收器。检查应用程序中使用的任何源或接收器（例如其他 AWS 服务、外部源或目标）是否配置良好，没有遇到读取或写入限制，或者定期不可用。

  如果您的依赖服务遇到吞吐量相关的问题，请增加这些服务的可用资源，或者调查任何错误或不可用的原因。
+ **未正确配置运算符：**如果应用程序中其中一个运算符的线程上的工作负载分配不正确，则该运算符可能会过载，应用程序可能会崩溃。有关调整运算符并行度的信息，请参见 [正确管理运算符扩展](performance-improving.md#performance-improving-scaling-op)。
+ **应用程序失败 DaemonException：**如果您使用的是 1.11 之前的 Apache Flink 版本，则此错误会出现在应用程序日志中。您可能需要升级到更高版本的 Apache Flink，这样才能使用 KPL 0.14 或更高版本。
+ **应用程序失败 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`

  若要对这种情况进行故障排除，请检查以下内容：
  + 检查您的 CloudWatch 指标，看看 CPU 或内存使用率是否出现异常峰值。
  + 检查您的应用程序是否存在吞吐量问题。有关更多信息，请参阅 [性能问题排查](performance-troubleshooting.md)。
  + 检查您的应用程序日志，了解您的应用程序代码引发的未处理异常。
+ **应用程序失败并出现 “ 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 Beam 创建应用程序](examples-beam.md)。
+ **应用程序故障因 java.io.ioException 错误：网络缓冲区数量不足**

  当应用程序没有为网络缓冲区分配足够的内存时，就会发生这种情况。网络缓冲区便于子任务之间的通信。它们用于在通过网络传输之前存储记录，也用于存储传入的数据，然后再将其解析成记录并交给子任务。所需的网络缓冲区数量直接随着任务图的并行度和复杂性而变化。有多种方法可以缓解此问题：
  + 您可以配置较低的配置，`parallelismPerKpu`以便为每个子任务和网络缓冲区分配更多的内存。请注意，降低`parallelismPerKpu`会增加 KPU，从而增加成本。为避免这种情况，您可以通过将并行度降低相同的系数来保持相同数量的 KPU。
  + 您可以通过减少运算符的数量或链接运算符来简化任务图，从而减少所需的缓冲区。
  + 否则，您可以联系以https://aws.amazon.com/premiumsupport/获取自定义网络缓冲区配置。