Kinesis Data Streams용 KCL 애플리케이션의 차단 또는 중단 문제를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 5월 6일

Amazon Kinesis Client Library(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 구성 확인

KCL 플릿 수를 확인하고 Kinesis Data Stream의 샤드 개수를 메모합니다. 샤드 개수가 증가하면 KCL의 샤드 개수에 따라 maxLeasesPerWorker 파라미터가 증가합니다.

KCL 애플리케이션의 DynamoDB 테이블 분석

모든 KCL 애플리케이션은 KCL 애플리케이션과 동일한 이름의 DynamoDB 테이블을 생성해서 애플리케이션 상태를 추적합니다. KCL 애플리케이션 문제를 해결하려면 DynamoDB 테이블의 열을 분석하십시오.

테이블의 checkpoint 열이 업데이트되지 않을 경우, processRecords 메서드 로직이 중단된 것입니다. checkpoint와 leaseCounter 열이 업데이트되지 않으면 maxLeasesPerWorker=1 파라미터가 다른 작업자가 임대를 가져가지 못하게 차단하고 있는 것입니다. processRecords 메서드를 해제하려면 파라미터 값을 높이십시오.

고급 KCL 경고 로그 활성화

레코드 프로세서가 차단되었는지 확인하려면 KCL 구성의 logWarningForTaskAfterMillis 값을 밀리초로 설정합니다. 그러면 KCL이 레코드 프로세서가 완료되기를 기다렸다가 처리 시간에 대한 경고 메시지를 로그로 보냅니다. 경고 메시지가 로깅될 경우, JVM에서 연속적인 스택 덤프를 캡처하면 무엇이 차단되었는지 발견하는 데 도움이 됩니다. jstack 명령을 사용하여 스택 트레이스를 캡처할 수 있습니다.

logWarningForTaskAfterMillis 값에 대한 자세한 내용은 GitHub의 Amazon Web Services - Labs를 참조하십시오.

KCL 디버그 로그 활성화

KCL 디버그 로그를 활성화하여 KCL이 Kinesis Data Streams에서 데이터를 사용하지 못하게 한 원인이 되는 문제를 찾아낼 수 있습니다. KCL 애플리케이션을 다시 시작해서 다른 애플리케이션 문제를 해결하는 것도 좋습니다.

KCL을 다시 시작했는데도 여전히 작동하지 않는다면 샤드 소유권 이전으로 인해 발생하는 문제일 수 있습니다. 이는 KCL에 복제하려는 데이터에 대한 로그가 기록되지 않는 문제를 일으키기도 합니다. 이 문제는 KCL 플릿에서 로깅 기능을 활성화하면 해결할 수 있습니다.

로그를 활성화하려면 다음 단계를 수행하십시오.

1.    로거를 선택합니다.

2.    src/main/resources 폴더에 log4.properties 파일을 만들어서 로그 메시지를 콘솔로 리디렉션합니다.

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.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.RollingFileAppender
log4j.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>

이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?