Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

메모리 부족이 의심되는 Spark 작업 조사

메모리 부족은 실행기가 종료되거나 드라이버 연결이 끊기는 형태로 나타날 수 있습니다. 다음 메시지가 단서가 됩니다.

  • Job aborted due to stage failure
  • ExecutorLostFailure
  • Spark module died while job [jobID] was using it. (ExitReason: MODULE_UNREACHABLE)
  • Connection lost to driver

이 메시지만으로 메모리 부족을 확정하지는 않습니다. 예를 들어 ExecutorLostFailure는 실행기를 잃었다는 실패 유형이며 다른 종료 원인도 포함할 수 있습니다. 작업 로그와 이전 성공 실행에서 실제 메모리 소진, 종료 이유와 데이터량 변화를 함께 확인합니다.

드라이버와 분산 연산 구분

Spark 변환에서 데이터를 드라이버로 모아 일반 Python 또는 pandas로 계산하면 클러스터 전체 자원을 사용하는 대신 드라이버 메모리와 처리 능력에 제한될 수 있습니다. 가능한 표 연산은 PySpark의 분산 DataFrame 연산으로 표현하는 방법을 검토합니다.

Python으로 작성했다는 사실만으로 모든 연산이 드라이버에서 실행되는 것은 아닙니다. PySpark 연산과 드라이버의 로컬 계산을 구분하여 어느 구간에서 데이터가 모이는지 확인합니다.

조인 점검

키 쏠림과 null

특정 키 또는 결측값 처리 구간에 행이 몰리는지 확인합니다. Spark의 일반 동등 조인에서 NULL = NULL은 참이 아니므로 null끼리 자동으로 일치하지 않습니다. 반면 null-safe 비교인 <=>를 쓰거나 결측값을 같은 값으로 치환하면 많은 행이 같은 키로 결합될 수 있습니다.

null을 제외해도 업무 의미가 유지되는 입력이라면 해당 열을 기준으로 먼저 필터링할 수 있습니다. 필요한 행까지 무조건 제거하지 말고 조인 종류와 결측값의 의미를 먼저 정합니다.

결과 행 수 증가

양쪽 입력에서 같은 키가 여러 번 나오면 결과 행 수가 크게 늘 수 있습니다. 키별 행 수와 조인 후의 행 수를 비교하여 그 증가가 필요한 업무 결과인지 확인합니다. 예상하지 않은 다대다 결합은 메모리와 계산량을 모두 늘릴 수 있습니다.

반복 조인의 실행 계획

같은 테이블에 반복해서 조인하는 로직은 논리 실행 계획이 급격히 커질 수 있습니다. 체크포인트로 중간 결과를 구체화하고 계획을 끊는 방법을 검토합니다. 단순히 메모리 캐시를 더 추가하는 것과는 다릅니다. Spark의 DataFrame checkpoint는 구성한 체크포인트 디렉터리에 결과를 저장하고 그 지점 이전의 논리 계획을 줄입니다.

파일과 처리 범위

Dataset > Details > Files > Dataset Files에서 입력 파일의 크기를 확인합니다. 파일이 지나치게 작으면 파일 수와 처리 부담이 늘고, 지나치게 크면 분할과 메모리 사용에 문제가 생길 수 있습니다. 분할을 조정할 때 파일당 128MB 이상 정도의 규모를 참고할 수 있지만 작은 전체 입력까지 각 파일을 그 크기로 만들어야 하는 절대 하한은 아닙니다.

필요하지 않은 열은 입력에서 미리 제외하고 불필요한 행은 일찍 필터링하여 Spark가 보관할 데이터량을 줄입니다. 가능한 경우 복잡한 로직을 단순하게 만들거나 하나의 큰 변환을 여러 작은 변환으로 나눕니다. 단계를 나누면 어느 구간에서 메모리가 늘어나는지도 파악하기 쉽습니다.

자원을 늘려야 하는 경우

코드와 데이터 처리 방식을 조정해도 필요한 계산을 수행할 메모리가 부족하면 자원을 추가할 수 있습니다. 드라이버에서 발생한 문제인지 실행기에서 발생한 문제인지 확인한 뒤 해당 Spark 프로필을 조정합니다. 자원 증가는 빌드의 연산 사용량과 비용을 늘릴 수 있습니다.

입력 증가나 shuffle 양 변화가 원인이라면 프로필만 올리는 것과 함께 반복 계산을 줄이는 처리 방식도 검토합니다. 증분 파이프라인의 파일 및 트랜잭션 누적은 일회성 메모리 문제와 다른 장기 성능 원인이 될 수 있습니다.