Pinterest, Spark OOM 에러 96% 감소! Auto Memory Retries 비법 공개

by DD
3개월 전
조회수 6

Pinterest는 Spark 애플리케이션의 OOM(Out-of-Memory) 에러를 줄이기 위해 Auto Memory Retries 기능을 개발

Auto Memory Retries는 작업의 메모리 사용량을 분석하여, OOM 발생 시 자동으로 더 큰 메모리 할당을 시도

그 결과, OOM 에러 발생률을 96% 감소시키고, 플랫폼 비용 절감 및 운영 부담을 줄이는 데 성공

Spark Task 수준에서 리소스 프로파일을 관리하고, OOM 발생 시 CPU 증가 및 Executor 확장을 통해 메모리 문제를 해결

향후, 사전 예방적 메모리 증가(Proactive Memory Increase) 및 자동 튜닝(Auto Tuning)을 통해 비용 절감 및 성능 향상을 지속적으로 추진

Auto Memory Retries의 핵심 아키텍처

Pinterest는 Auto Memory Retries를 통해 OOM(Out-of-Memory) 에러를 해결하기 위해 Apache Spark의 Task 수준 리소스 프로파일링(Task-level Resource Profiling)을 도입했다.

Task 클래스 확장: 각 Task에 taskRpId를 추가하여 리소스 프로파일 ID를 저장

TaskSetManager: OOM 발생 시, 다음 단계의 리소스 프로파일(Retry Profile)을 할당

TaskSchedulerImpl: Executor 할당 시 Task의 리소스 프로파일을 고려하여 스케줄링

ExecutorAllocationManager: Retry Profile에 따라 Executor 할당 및 관리

이러한 구조를 통해, OOM 발생 시 Task를 자동으로 재시도하고, 더 큰 메모리 할당을 가능하게 한다.

OOM 에러 해결을 위한 단계별 전략

Auto Memory Retries는 OOM 에러 발생 시, 두 가지 방법을 순차적으로 적용하여 문제를 해결한다.

CPU 증가: OOM 발생 시, CPU per task 속성(Cpus per task property)을 2배 증가시켜 기존 Executor에서 재실행

Executor 확장: CPU 증가에도 OOM이 지속되면, 더 큰 메모리(Larger Executor)를 가진 새로운 Executor를 할당

Off-heap 메모리: Apache Gluten과 같은 기술 사용 시, Off-heap 메모리(Off-heap memory)도 함께 증가

이러한 하이브리드 전략은 성능 저하를 최소화하면서 OOM 에러를 효과적으로 해결한다.

Auto Memory Retries의 구현 상세

Auto Memory Retries 기능 구현을 위해 Pinterest는 Apache Spark의 핵심 클래스를 확장했다.

Task: taskRpId를 추가하여 Task의 리소스 프로파일 ID를 저장

ResourceProfileManager: 새로운 리소스 프로파일 등록 시, 자동으로 Retry Profile 생성

TaskSetManager: OOM 발생 시, Retry Profile 할당 및 Task 인덱스 관리

TaskSchedulerImpl: Retry Profile에 따라 Executor 할당

ExecutorAllocationManager: Retry Profile에 따라 Executor 할당

Pinterest는 Spark Listener 대신, 자체 클래스 상속 방식을 선택하여 세밀한 제어(Finer Control)를 확보했다.

성능 개선을 위한 Proactive Memory Increase

Pinterest는 Auto Memory Retries의 효과를 극대화하기 위해 Proactive Memory Increase 기능을 도입했다.

OOM 에러 모니터링: 특정 단계(Stage)에서 OOM 에러 발생률이 임계치를 초과하면, 해당 단계의 모든 Task에 Retry Profile을 사전 할당

장점: OOM 발생 전에 미리 메모리 할당을 조정하여, 불필요한 재시도(Retries)를 방지

결과: Ad hoc 작업(Ad hoc submissions)의 OOM 에러 감소 및 전반적인 성능 향상

이러한 사전 예방적 접근 방식을 통해, Pinterest는 비용 절감(Cost Savings)성능 향상(Performance Improvement)을 동시에 달성했다.

Auto Memory Retries의 운영 및 모니터링

Pinterest는 Auto Memory Retries 기능의 안정적인 운영을 위해, 여러 단계에 걸쳐 점진적으로 배포했다.

단계적 배포: Ad hoc 작업(Ad hoc submissions)부터 시작하여, Tier 3, Tier 2, Tier 1 순으로 배포

모니터링 지표: 비용 절감, 작업 복구 횟수, MB/Vcore seconds 절감, 재시도 후 실패율 등을 측정

SparkUI 개선: Task List에 Task Resource Profile ID를 표시하여 가시성(Visibility) 확보

이러한 체계적인 접근 방식을 통해, Pinterest는 기능 배포 과정에서 발생할 수 있는 문제를 최소화하고, 안정적인 운영 환경(Stable Operating Environment)을 구축했다.

Drastically Reducing Out-of-Memory Errors in Apache Spark at Pinterest

댓글 0

첫 번째 댓글을 남겨보세요!