跳至内容

为什么我的适用于 Apache Flink 的亚马逊托管服务应用程序中的检查点会失败?

1 分钟阅读
0

我的适用于 Apache Flink 的亚马逊托管服务应用程序中的检查点或保存点一直出现故障。

简短描述

检查点操作是用于在适用于 Apache Flink 的亚马逊托管服务中实现容错的方法。如果您没有优化或正确配置应用程序,则可能会遇到检查点故障。

检查点故障的一些主要原因如下:

  • 对于 Rocks 数据库,Apache Flink 从本地存储读取文件并写入远程永久存储,即 Amazon Simple Storage Service (Amazon S3)。本地磁盘的性能和上传速率可能会影响检查点并导致检查点故障。
  • 保存点和检查点状态存储在由 AWS 完全管理的服务专有 Amazon S3 存储桶中。每当应用程序故障转移时,都会访问这些状态。S3 存储桶中的临时服务器错误或延迟可能会导致检查点故障。
  • 您创建的进程函数(其中函数在检查点期间与外部资源进行通信,例如 Amazon DynamoDB)可能会导致检查点故障。
  • 状态序列化,例如序列化程序与传入数据不匹配,可能会导致检查点故障。
  • 为应用程序配置的 Kinesis 处理单元 (KPU) 的数量可能不够。要查找分配的 KPU,请使用以下计算方法:
    为应用程序分配的 KPU = 并行性/ParallelismPerKPU
  • 较大的应用程序状态大小可能会导致检查点延迟增加。任务管理器需要更多时间来保存检查点,并且可能导致内存不足异常。
  • 偏差的状态分布可能导致一个任务管理器与其他任务管理器相比处理更多数据。即使预调配了足够的 KPU(资源),过载的任务管理器也可能导致内存不足异常。
  • 高基数表示传入数据中有大量的唯一密钥。如果作业使用 KeyBy 运算符对传入数据进行分区,并且包含数据的密钥具有高基数,则可能会出现缓慢的检查点操作。缓慢的检查点操作最终可能会导致检查点故障。

解决方法

要对您的适用于 Apache Flink 的亚马逊托管服务应用程序故障进行故障排除,请执行以下操作:

  • 使用 lastCheckPointDurationlastCheckpointSize Amazon CloudWatch 指标来监控您的检查点大小和持续时间。应用程序状态的大小可能会迅速增加,并导致检查点大小和持续时间增加。有关详细信息,请参阅应用程序指标
  • 提高处理更多数据的运算符的并行度。您可以使用 setParallelism() 方法为单个运算符、数据源或数据接收器定义并行度。有关详细信息,请参阅 Flink 网站上的并行执行
    **注意:**当您增加运算符并行度时,可能会影响检查点的总时间。您也可以使用未对齐的检查点并进行相应的优化。有关详细信息,请参阅 Flink 网站上的背压下的检查点操作
  • 调整 ParallelismParallelismPerKPU 值,以实现最佳 KPU 利用率。确保您的适用于 Apache Flink 的亚马逊托管服务应用程序已打开自动扩缩功能。maxParallelism 参数的值允许您扩展 KPU 的数量。有关详细信息,请参阅适用于 Apache Flink 的亚马逊托管服务中的应用程序扩展
  • 在状态上定义 TTL,以确保定期清理该状态。有关详细信息,请参阅 Flink 网站上的 Class StateTtlConfig.Builder
  • 优化代码以更好地进行分区。使用重新平衡分区来帮助均匀分配数据。重新平衡分区使用轮询方法进行分配。有关详细信息,请参阅 Flink 网站上的重新平衡
  • 优化代码以减小窗口大小,从而减少窗口中键数量的基数。

相关信息

Flink 网站上的检查点

在适用于 Apache Flink 的托管服务中实施容错

AWS 官方已更新 3 年前