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 애플리케이션의 DynamoDB 테이블 분석
모든 KCL 애플리케이션은 애플리케이션의 상태를 추적하기 위해 KCL 애플리케이션과 동일한 이름의 DynamoDB 테이블을 생성합니다. KCL 애플리케이션의 문제를 해결하려면 DynamoDB 테이블의 열을 분석하세요.
테이블의 체크포인트 열이 업데이트되지 않은 경우 processRecords 메서드 로직이 중단된 것입니다. 체크포인트와 leaseCounter 열이 모두 업데이트되지 않으면 maxLeasesPerWorker=1 매개변수가 다른 작업자가 임대를 차지하지 못하도록 막습니다. processRecords 메서드의 차단을 해제하려면 매개변수 값을 늘리세요.
KCL 구성 확인
KCL 플릿 수를 확인합니다. Kinesis 데이터 스트림의 샤드 수를 확인합니다. 샤드 수가 증가하면 KCL의 샤드 수에 따라 maxLeasesPerWorker 파라미터를 늘리세요.
고급 KCL 경고 로그 켜기
레코드 프로세서가 차단되었는지 확인하려면 KCL 구성의 logWarningForTaskAfterMillis 값을 밀리초로 설정합니다. 그러면 KCL은 레코드 프로세서가 완료될 때까지 기다렸다가 처리 시간에 대한 경고 메시지를 로그에 기록합니다. 경고 메시지가 기록되면 JVM에서 연속적인 스택 덤프를 캡처하여 무엇이 차단되었는지 확인합니다. jstack 명령을 사용하여 스택 추적을 캡처할 수 있습니다. logWarningForTaskAfterMillis 값에 대한 자세한 내용은 GitHub 웹사이트의 LifecycleConfig.java를 참고하세요.
KCL 디버그 로그 켜기
KCL 디버그 로그를 켜서 KCL이 Kinesis 데이터 스트림에서 데이터 소비를 중단하게 만든 문제를 식별할 수 있습니다. 또한 다른 애플리케이션 문제를 해결하려면 KCL 애플리케이션을 다시 시작하는 것이 좋습니다.
KCL을 다시 시작했는데도 KCL이 여전히 멈춘다면 샤드 소유권 이전으로 인한 문제일 수 있습니다. 샤드 소유권 이전 문제로 인해 KCL에 복제하려는 데이터에 대한 로그가 없는 문제가 발생할 수도 있습니다. 이 문제를 해결하려면 KCL 차량에서 로깅 기능을 사용 설정하세요.
로그를 켜려면 다음 단계를 완료하세요.
-
로거를 선택하세요.
-
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에서 로그를 디버깅하는 데 사용됩니다.
-
로그 메시지를 로그 파일로 리디렉션합니다.
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
-
POM 파일에 log4j 종속성을 포함하세요.
<dependency> <groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
관련 정보
Amazon CloudWatch로 Kinesis Client Library 모니터링
리샤딩, 스케일링 및 병렬 처리