Kinesis Data Analytics for Java Applications 故障排除 - Amazon Kinesis Data Analytics
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Kinesis Data Analytics for Java Applications 故障排除

以下内容可以帮助您解决可能遇到的 Amazon Kinesis Data Analytics for Java Applications 问题。

常规故障排除:分析日志

您可以查询应用程序的 CloudWatch 日志以调查应用程序问题。

我们建议您将日志级别设置为 INFO。该日志级别在日志中写入足够多的信息,以帮助解决大多数问题。在解决问题时,您可以在短时间内使用 DEBUG 日志级别,但这可能会造成严重的应用程序性能问题。

有关设置和分析 CloudWatch 日志的信息,请参阅日志记录和监控

如果应用程序没有在 CloudWatch 日志中写入条目,请参阅日志记录故障排除

无法访问 VPC 中的资源

如果应用程序使用 Amazon VPC,请执行以下操作以验证应用程序是否有权访问其资源:

  • 检查 CloudWatch 日志以查找以下错误。该错误表明应用程序无法访问 VPC 中的资源:

    org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms.

    如果看到该错误,请确认正确设置了路由表,并且连接器具有正确的连接设置。

    有关设置和分析 CloudWatch 日志的信息,请参阅日志记录和监控

  • 确认您没有在 Amazon VPC 中的子网上使用受限制的 CIDR。有关更多信息,请参阅限制

编译错误:“无法解析项目的依赖项”

要编译 Kinesis Data Analytics for Java Applications 示例应用程序,您必须先下载并编译 Apache Flink Kinesis 连接器,然后将其添加到本地 Maven 存储库中。如果尚未将连接器添加到存储库中,则会显示类似下面的编译错误:

Could not resolve dependencies for project your project name: Failure to find org.apache.flink:flink-connector-kinesis_2.11:jar:1.8.2 in https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced

要解决该错误,您必须下载连接器的 Apache Flink 源代码(位于 https://flink.apache.org/downloads.html 中的版本 1.8.2)。有关如何下载、编译和安装 Apache Flink 源代码的说明,请参阅使用 Apache Flink Kinesis Streams 连接器

无效的选项:“kinesisanalyticsv2”

要使用 Kinesis Data Analytics API 的第 2 版,您需要安装 AWS Command Line Interface (AWS CLI) 的最新版本。

有关升级 AWS CLI 的信息,请参阅 AWS Command Line Interface 用户指南 中的安装 AWS 命令行界面

在写入到 Amazon S3 存储桶时丢失数据

在使用 Apache Flink 版本 1.6.2 写入到 Amazon S3 存储桶时,可能会丢失一些数据。在直接使用 S3 存储输出时,我们建议使用 Apache Flink 版本 1.8.2。要使用 Apache Flink 1.6.2 写入到 Amazon S3 存储桶,我们建议使用 Kinesis Data Firehose。有关将 Kinesis Data Firehose 与 Kinesis Data Analytics 一起使用的更多信息,请参阅 Kinesis Data Firehose 接收器

应用程序处于 RUNNING 状态,但不处理数据

您可以使用 ListApplicationsDescribeApplication 操作检查应用程序状态。如果应用程序进入 RUNNING 状态,但没有将数据写入到接收器,您可以在应用程序中添加 Amazon CloudWatch 日志流以解决该问题。有关更多信息,请参阅 使用应用程序 CloudWatch 日志记录选项。日志流包含可用于解决应用程序问题的消息。

应用程序无法进入 RUNNING 状态

您可以使用 ListApplicationsDescribeApplication 操作检查应用程序状态。如果应用程序无法进入 RUNNING 状态,请检查以下内容:

  • 确认应用程序 JAR 文件小于 512 MB。不支持超过 512 MB 的 JAR 文件。

  • 检查应用程序的 CloudWatch 日志以查找错误。有关为应用程序设置 CloudWatch 日志的信息,请参阅设置应用程序日志记录

无法创建快照

Kinesis Data Analytics 在 UpdateApplicationStopApplication 请求期间拍摄应用程序的快照。然后,该服务使用此快照状态,并使用更新的应用程序配置还原应用程序以提供恰好一次处理语义。

在以下情况下,该服务无法拍摄应用程序的快照:

  • 应用程序超过快照限制。快照限制为 1,000 个。有关更多信息,请参阅 快照

  • 应用程序未处于正常状态。

  • 应用程序无权访问其源或接收器。

  • 应用程序代码无法正常工作。

  • 应用程序遇到其他配置问题。

如果在应用程序更新期间拍摄快照或停止应用程序时遇到异常,请检查应用程序的 CloudWatch 日志以查找错误,然后重试该请求。您也可以将应用程序的 ApplicationSnapshotConfigurationSnapshotsEnabled 属性设置为 false 以重试该请求。

在应用程序恢复正常状态后,我们建议您将 SnapshotsEnabled 属性设置为 true

您可以使用 UpdateApplication 操作以设置 SnapshotsEnabled 属性。以下 UpdateApplication 示例将 SnapshotsEnabled 属性设置为 true

aws kinesisanalyticsv2 update-application \ --application-name MyApplication \ --current-application-version-id 10 \ --application-configuration-update '{"ApplicationSnapshotConfigurationUpdate":{"SnapshotsEnabledUpdate":true}}'

您也可以使用控制台更新 SnapshotsEnabled 属性。

使用控制台更新 SnapshotsEnabled 属性

  1. 打开 Kinesis Data Analytics 控制台 ( https://console.amazonaws.cn/kinesisanalytics)。

  2. 在 Kinesis Data Analytics 控制台中,选择您的应用程序。

  3. 在应用程序页面中,选择 Configure (配置)

  4. Snapshots (快照) 部分中,选择 Enable (启用)

    
                    显示 Snapshots (快照) 部分的屏幕截图。

从快照中还原失败

如果在应用程序更新中删除或更改一个操作符并尝试从快照中还原,默认情况下,如果快照包含缺少的操作符的状态数据,还原将失败。此外,应用程序将停滞在 STOPPEDUPDATING 状态。要更改该行为并成功完成还原操作,请将应用程序的 FlinkRunConfigurationAllowNonRestoredState 参数更改为 true。这样,恢复操作就可以跳过无法映射到新程序的状态数据。

有关更多信息,请参阅 从包含不兼容状态数据的快照中还原

吞吐量太慢或 MillisBehindLatest 持续增加

如果应用程序指标显示吞吐量太慢或 MillisBehindLatest 指标持续增加,请执行以下操作:

  • 启用自动扩展(如果已禁用),或者增加应用程序并行度。有关更多信息,请参阅 扩展

  • 检查应用程序是否为处理的每个记录写入一个条目。在应用程序具有较高的吞吐量时,为每个记录写入一个日志条目将导致严重的数据处理瓶颈。要检查这种情况,请查询日志以查找应用程序为它处理的每个记录写入的日志条目。有关更多信息,请参阅 使用 CloudWatch Logs Insights 分析日志

  • 增加应用程序的并行度。您可以使用 UpdateApplication 操作的 ParallelismConfigurationUpdate 参数更新应用程序的并行度。

    应用程序的最大 KPU 默认为 32 个,可以请求增加限制以增加该数值。

  • 验证是否未平均分配应用程序的工作负载。要控制如何在应用程序的工作进程中分配工作负载,请使用 Parallelism 设置和 KeyBy 操作符。有关更多信息,请参阅 Apache Flink 文档中的以下主题:

  • 检查应用程序逻辑以查找效率低下或性能不佳的操作,例如,访问外部依赖项(如数据库或 Web 服务),访问应用程序状态,等等。如果您使用外部依赖项以丰富或以其他方式处理传入数据,请考虑改用异步 IO。有关更多信息,请参阅 Apache Flink 文档中的异步 I/O

  • 确保应用程序没有引发异常而导致作业重新启动。任何作业重新启动将会减慢处理速度,因为将回收并重建该作业,并且永久保存和还原状态数据。有关使用 CloudWatch 日志记录应用程序错误的信息,请参阅设置应用程序日志记录

快照、应用程序更新或应用程序停止错误:InvalidApplicationConfigurationException

在快照操作期间或创建快照的操作(例如更新或停止应用程序)期间,可能会出现类似下面的错误:

An error occurred (InvalidApplicationConfigurationException) when calling the UpdateApplication operation: Failed to take snapshot for the application xxxx at this moment. The application is currently experiencing downtime. Please check the application's CloudWatch metrics or CloudWatch logs for any possible errors and retry the request. You can also retry the request after disabling the snapshots in the Kinesis Data Analytics console or by updating the ApplicationSnapshotConfiguration through the AWS SDK

在应用程序无法创建快照时,将会出现该错误。

如果在快照操作期间或创建快照的操作期间遇到该错误,请执行以下操作:

  • 为应用程序禁用快照。您可以在 Kinesis Data Analytics 控制台中执行该操作,也可以使用 UpdateApplication 操作的 SnapshotsEnabledUpdate 参数以执行该操作。

  • 调查无法创建快照的原因。有关更多信息,请参阅 无法创建快照

  • 在应用程序恢复正常状态时,重新启用快照。

Downtime 不为零

如果 Downtime 指标不为零,则应用程序运行状况不佳。导致这种情况的常见原因包括:

  • 为应用程序预置的源和接收器不足。检查是否正确预置应用程序中使用的任何源或接收器,并且它们没有受到读取或写入限制。

    如果源或接收器是 Kinesis 数据流,请检查该流的指标以查找 ReadProvisionedThroughputExceededWriteProvisionedThroughputExceeded 错误。

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

  • 如果未处理应用程序中的操作符的任何异常,应用程序将进行故障转移(解释操作符无法处理该故障),并且应用程序从最新的检查点重新启动以保持”恰好一次”处理语义。这会导致在这些重新启动期间 Downtime 不为零。为了防止发生这种情况,我们建议您在应用程序代码中处理任何可重试的异常。

java.nio.file.NoSuchFileException: /usr/local/openjdk-8/lib/security/cacerts

在以前的部署中更新了 SSL 信任存储库位置。请在 ssl.truststore.location 参数中改用以下值:

/usr/local/openjdk-8/jre/lib/security/cacerts

UpdateApplication 操作不重新加载应用程序代码

如果未指定 S3 对象版本,UpdateApplication 操作不会使用相同的文件名重新加载应用程序代码。要使用相同的文件名重新加载应用程序代码,请在 S3 存储桶上启用版本控制,并使用 ObjectVersionUpdate 参数指定新的对象版本。有关在 S3 存储桶中启用对象版本控制的更多信息,请参阅启用或禁用版本控制