如何解决 Kinesis Data Streams 的 KCL 应用程序被阻止或卡住的问题?

2 分钟阅读
0

我的 Amazon Kinesis 客户端库(KCL)应用程序卡住了,无法处理任何 Amazon Kinesis Data Streams 记录。

简短描述

KCL 应用程序可能会因以下原因而卡住或被阻止:

  • 记录处理器(一种用户实现的方法)执行阻止操作或比正常情况花费更长的时间。
  • 没有数据记录放到分片中。
  • 在检索记录时,KCL 卡住了。
  • KCL 无法计划处理或无法进入检查点。

要检测和解决 KCL 问题,请完成下面的任务:

  • 分析 KCL 指标。
  • 分析 KCL 应用程序的 Amazon DynamoDB 表。
  • 检查 KCL 配置。
  • 启用 KCL 警告日志。
  • 启用 KCL 调试日志。

解决方法

分析 KCL 指标

监控 RecordProcessor.processRecords.Time 指标。确认记录处理器的 processRecords 方法所花费的时间少于 60 秒。如果 processRecords 方法被阻止,则 KCL 必须等待。在记录处理器完成其工作后,优化 processRecords 方法。

分析 KCL 应用程序的 DynamoDB 表

每个 KCL 应用程序都会创建一个与 KCL 应用程序同名的 DynamoDB 表来跟踪应用程序的状态。要对 KCL 应用程序进行故障排除,请分析 DynamoDB 表中的列。

如果表中的检查点列未更新,则 processRecords 方法逻辑会卡住。如果检查点和 leaseCounter 列均未更新,则 maxLeasesPerWorker=1 参数会阻止其他 Worker 占用租约。要解除对 processRecords 方法的阻止,请增加参数值。

检查 KCL 配置

检查 KCL 实例集的数量。记下 Kinesis 数据流中的分片数量。如果分片数量增加,请根据 KCL 中的分片数量增加 maxLeasesPerWorker 参数。

启用高级 KCL 警告日志

要验证记录处理器是否被阻止,请将 KCL 配置的 logWarningForTaskAfterMillis 值设置为毫秒。然后,KCL 等待记录处理器完成,随后 KCL 向日志发出有关处理时间的警告消息。如果记录了警告消息,则从 JVM 中捕获连续的堆栈转储来发现被阻止的内容。可以使用 jstack 命令捕获任何堆栈跟踪。有关 logWarningForTaskAfterMillis 值的更多信息,请参阅 GitHub 网站上的 LifecycleConfig.java

启用 KCL 调试日志

可以启用 KCL 调试日志来确定导致 KCL 停止使用来自 Kinesis Data Streams 的数据的问题。重启 KCL 应用程序以清除任何其他应用程序问题也是一种最佳做法。

如果重启了 KCL,但 KCL 仍然卡住,则可能是分片所有权转移导致的问题。分片所有权转移问题也可能会导致 KCL 没有您试图重现的数据的日志这一问题。要解决此问题,请在 KCL 实例集上启用日志记录功能。

要启用日志,请完成下面的步骤:

  1. 选择一个记录器。

  2. src/main/resources 文件夹中创建一个 log4.properties 文件,将日志消息重定向至控制台:

    log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
    log4j.logger.httpclient.wire=DEBUG

    **注意:**在此示例中,log4j 用于调试 Java 中的日志。

  3. 将日志消息重定向至日志文件:

    log4j.appender.file=org.apache.log4j.RollingFileAppenderlog4j.appender.file.File=/Users/harshdev/Desktop/logfolder/    <== Give the log location where you want to create log files
    log4j.appender.file.MaxFileSize=5MB
    log4j.appender.file.MaxBackupIndex=10
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
    log4j.rootLogger=DEBUG, stdout, file
  4. 在 POM 文件中包含 log4j 依赖项:

    <dependency>        <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
    </dependency>

相关信息

Monitoring the Kinesis Client Library with Amazon CloudWatch

Resharding, scaling, and parallel processing

AWS 官方
AWS 官方已更新 1 年前