跳至内容

为什么我的适用于 Apache Flink 的亚马逊托管服务应用程序会重启?

1 分钟阅读
0

我的适用于 Apache Flink 的亚马逊托管服务应用程序不断重启。

解决方法

当任务失败时,Apache Flink 应用程序会重启失败的任务和其他受影响的任务,使任务进入正常状态。

以下是导致此问题的一些原因和故障排除步骤。

代码错误

诸如 NullPointerExceptionDataCast 类型之类的代码错误在任务管理器中生成,并最终传递到作业管理器。然后,应用程序将从最新的检查点重启。要检测应用程序因应用程序中未处理的异常而重启,请检查 Amazon CloudWatch 指标,例如 downtime(停机时间)。此指标在重启期间显示非零值。要确定导致这种情况发生的原因,请查询应用程序日志,以了解应用程序状态从 RUNNING(正在运行)到 FAILED(已失败)的变化。有关详细信息,请参阅分析错误: 与应用程序任务相关的故障

内存不足异常

当您遇到内存不足异常时,任务管理器无法向作业管理器发送健康的检测信号,应用程序将重启。在这种情况下,您可能会在应用程序日志中看到错误,例如 TimeoutExceptionFlinkExceptionRemoteTransportException

检查应用程序是否由于 CPU 或内存资源压力而过载:

  • 确保 fullRestartsdowntime CloudWatch 指标的值不为零。
  • 检查 cpuUtilizationheapMemoryUtilization 指标中是否出现异常峰值。
  • 检查应用程序代码中是否存在未处理的异常。
  • 检查检查点和保存点故障。监控 numOFFailedCheckpointslastCheckpointSizelastCheckpointDuration CloudWatch 指标是否出现峰值和稳定的增加。

要解决峰值和稳定的增加,请完成以下任务:

  • 如果您打开应用程序的调试日志,则应用程序资源利用率可能会很高。要减少日志记录量,请仅在调查问题时临时打开调试日志。
  • 分析 Apache Flink 控制面板中的 TaskManager 线程转储。例如,您可以从线程转储中识别 CPU 密集型进程。
  • 要查看构造的火焰图,请对堆栈轨迹进行多次采样。要检查是否有阻塞的调用,请使用 CPU 外的火焰图。有关火焰图的信息,请参阅 Apache Flink 网站上的火焰图

节流错误

如果您的应用程序对源或接收器预调配不足,则您的应用程序在读取和写入流式传输服务(例如 Kinesis Data Streams)时可能会遇到节流错误。此问题可能会导致应用程序崩溃。要检查源和接收器的吞吐量,请使用 CloudWatch 指标,例如 WriteProvisionedThroughputExceededReadProvisionedThroughputExceeded。要容纳数据量,请增加分片数量以纵向扩展数据流。

超时错误

FlinkKinesisProducer 使用 Kinesis Producer Library (KPL) 将 Flink 流中的数据放入 Kinesis 数据流。超时错误可能导致 KPL 故障,从而可能导致 Flink 应用程序重启。在这种情况下,您可能会看到缓冲时间和重试次数的增加。您可以修改 KPL 的 RecordMaxBufferedTimeRecordTtlRequestTimeout 配置,以便记录不会过期。有关详细信息,请参阅 GitHub 网站上的 default_config.properties。此外,还要监控重要的 KPL 指标,例如 ErrorsByCodeRetriesPerRecordUserRecordsPending。当这些指标显示应用程序已重启时,使用 CloudWatch Logs Insights 中的筛选条件来了解导致应用程序重启的故障。

请注意,并非所有错误都会导致应用程序立即重启。例如,应用程序代码中的错误可能会导致有向非循环图 (DAG) 工作流程错误。在这种情况下,不会为您的应用程序创建 DAG。应用程序关闭,不会立即重启。此外,当出现 Access denied 错误时,应用程序不会立即重启。

如果问题仍然存在,请联系 AWS Support 并提供以下信息:

  • 应用程序 ARN
  • 有关应用程序源和接收器的信息
  • 您的应用程序的 CloudWatch 日志
  • 问题发生时间 (UTC)
  • 来自 Apache Flink 控制面板的相关线程转储

相关信息

应用程序正在重启

AWS 官方已更新 4 年前