Amazon Managed Service for Apache Flink 애플리케이션의 체크포인트 또는 세이브포인트가 계속해서 실패합니다.
간략한 설명
체크포인팅은 Amazon Managed Service for Apache Flink에서 내결함성을 구현하는 데 사용되는 방법입니다. 애플리케이션을 최적화하지 않거나 적절하게 프로비저닝하지 않으면 체크포인트 오류가 발생할 수 있습니다.
체크포인트 실패의 주요 원인 중 일부는 다음과 같습니다.
- Rocks DB의 경우 Apache Flink는 로컬 스토리지에서 파일을 읽고 원격 영구 스토리지인 Amazon Simple Storage Service(Amazon S3)에 씁니다. 로컬 디스크의 성능 및 업로드 속도는 체크포인트에 영향을 주어 체크포인트 실패를 초래할 수 있습니다.
- 세이브포인트와 체크포인트 상태는 AWS가 완전히 관리하는 서비스 소유의 Amazon S3 버킷에 저장됩니다. 이러한 상태는 애플리케이션이 장애 조치를 취할 때마다 액세스됩니다. S3 버킷의 일시적인 서버 오류나 지연으로 인해 체크포인트 실패가 발생할 수 있습니다.
- Amazon DynamoDB와 같이 체크포인팅 중에 외부 리소스와 통신하는 프로세스 함수를 생성한 경우 체크포인트 실패가 발생할 수 있습니다.
- 직렬화기와 수신 데이터가 일치하지 않는 등의 상태 직렬화로 인해 체크포인트 실패가 발생할 수 있습니다.
- 애플리케이션에 프로비저닝된 KPU(Kinesis Processing Unit, Kinesis 처리 장치) 수가 충분하지 않을 수 있습니다. 할당된 KPU를 찾으려면 다음 계산을 사용하십시오.
애플리케이션에 할당된 KPU = 병렬 처리 / ParallelismPerKPU
- 애플리케이션 상태 크기가 커지면 체크포인트 지연 시간이 늘어날 수 있습니다. 작업 관리자가 체크포인트를 저장하는 데 시간이 오래 걸리고 메모리 부족 예외가 발생할 수 있습니다.
- 왜곡된 상태 분포로 인해 한 작업 관리자가 다른 작업 관리자에 비해 더 많은 데이터를 처리할 수 있습니다. 충분한 KPU(리소스)가 프로비저닝되어 있어도 과부하된 작업 관리자로 인해 메모리 부족 예외가 발생할 수 있습니다.
- 높은 카디널리티는 수신 데이터에 많은 수의 고유 키가 있다는 것을 나타냅니다. 해당 작업에서 KeyBy 연산자를 사용하여 들어오는 데이터를 분할하고 데이터가 포함된 키의 카디널리티가 높은 경우, 느린 체크포인팅이 발생할 수 있습니다. 느린 체크포인팅으로 인해 결국 체크포인트 실패가 발생할 수 있습니다.
해결 방법
Amazon Managed Service for Apache Flink 애플리케이션 실패에 대한 문제를 해결하려면 다음 조치를 취하십시오.
- lastCheckPointDuration 및 lastCheckpointSize Amazon CloudWatch 지표를 사용하여 체크포인트 크기와 기간을 모니터링합니다. 애플리케이션 상태의 크기가 급격하게 증가하여 체크포인트 크기와 기간이 늘어날 수 있습니다. 자세한 내용은 애플리케이션 지표를 참조하십시오.
- 더 많은 데이터를 처리하는 연산자의 병렬 처리를 높입니다. setParallelism() 메서드를 사용하면 개별 연산자, 데이터 소스 또는 데이터 싱크에 대한 병렬 처리를 정의할 수 있습니다. 자세한 내용은 Flink 웹사이트의 병렬 실행을 참조하십시오.
참고: 연산자 병렬 처리를 늘리면 전체 체크포인트 시간에 영향을 미칠 수 있습니다. 정렬되지 않은 체크포인트를 사용하여 적절히 최적화할 수도 있습니다. 자세한 내용은 Flink 웹사이트의 백프레셔에서의 체크포인팅을 참조하십시오.
- 최적의 KPU 활용도를 위해 병렬 처리 및 ParallelismPerKPU 값을 조정합니다. Amazon Managed Service for Apache Flink 애플리케이션에 대해 오토 스케일링이 활성화되어 있는지 확인합니다. maxParallelism 파라미터의 값을 사용하여 KPU 수의 규모를 조정할 수 있습니다. 자세한 내용은 Amazon Managed Service for Apache Flink의 애플리케이션 규모 조정을 참조하십시오.
- 상태에 TTL을 정의하여 상태가 주기적으로 정리되도록 합니다. 자세한 내용은 Flink 웹사이트의 클래스 StateTtlConfig.Builder를 참조하십시오.
- 더 나은 분할을 위해 코드를 최적화합니다. 재조정 분할을 사용하면 데이터를 균등하게 분산하는 데 도움이 됩니다. 재조정 분할은 분산을 위해 라운드 로빈 방식을 사용합니다. 자세한 내용은 Flink 웹사이트의 재조정을 참조하십시오.
- 창 크기를 줄이는 방식으로 코드를 최적화하여 창의 키 개수의 카디널리티를 줄입니다.
관련 정보
Flink 웹사이트의 체크포인트
Managed Service for Apache Flink에서 내결함성 구현