Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Spark 실행 구조와 자원 조정 기준

Spark는 데이터를 여러 연산 자원에 나누어 처리하는 분산 실행 엔진입니다. UC Berkeley의 연구에서 시작했고 2013년 Apache Incubator에 들어가 2014년 최상위 Apache 프로젝트가 되었습니다. Foundry는 Spark를 이용하여 SQL, Python, Java와 Java 기반의 전용 DSL인 Mesa 변환을 실행할 수 있습니다.

드라이버, 실행기와 파티션

Spark는 단계 사이의 의존 관계를 방향성 비순환 그래프(DAG)로 구성하고 메모리를 활용하여 계산합니다. 디스크 기반 MapReduce의 두 단계 처리 방식과 달리 여러 계산 단계를 연결할 수 있으며, 데이터가 메모리에 맞지 않으면 디스크 사용도 발생할 수 있습니다.

드라이버는 실행 계획과 작업 할당을 조율합니다. 실행기(executor)는 할당받은 파티션의 태스크를 처리하고 다음 작업을 수행합니다. 파티션은 데이터를 나누어 처리하는 단위이고, 실행기의 코어 수는 동시에 처리할 수 있는 태스크 수에 영향을 줍니다.

주요 자원 변수

변수조정하는 대상
Driver cores드라이버에 할당한 CPU 코어 수
Driver memory드라이버 JVM 메모리. 외부 Python 라이브러리 등 JVM 밖에서 사용하는 메모리는 별도 부담입니다.
Executor cores실행기 하나의 CPU 코어 수와 동시 태스크 수
Executor memory실행기 하나의 메모리. 그 실행기에서 동시에 실행하는 태스크들이 공유합니다.
Number of executors요청할 실행기 수

Spark 프로필은 이 자원을 구성합니다. 실행기나 메모리를 늘리면 처리 시간을 줄일 수 있지만 단위 시간당 할당 자원도 늘어납니다. 전체 연산 사용량은 자원 규모와 실행 시간의 변화를 함께 비교해야 합니다.

Code Repositories에서 기본값이 아닌 프로필을 사용하려면 저장소에 해당 프로필을 가져온 뒤 변환에 지정합니다. Pipeline Builder의 Spark 배치 프로필은 파이프라인의 빌드 설정에서 선택합니다.

기본값에서 조정하기

먼저 코드와 입력 처리 방식을 최적화합니다. 그래도 목적에 필요한 성능이나 메모리가 부족하면 한 번에 한 변수만 한 단계씩 조정합니다. 예를 들어 실행기 메모리만 EXECUTOR_MEMORY_SMALL에서 EXECUTOR_MEMORY_MEDIUM으로 바꾸고 결과를 비교합니다.

백엔드 기본값이 언제나 특정 프로필과 정확히 같지는 않지만 보통 SMALL 계열로 근사할 수 있습니다. 비-Python 변환의 일반적인 기준 구성은 다음과 같습니다.

  • EXECUTOR_CORES_SMALL
  • EXECUTOR_MEMORY_SMALL
  • DRIVER_CORES_SMALL
  • DRIVER_MEMORY_SMALL
  • NUM_EXECUTORS_2

Python 라이브러리가 JVM 밖에서 실행되면 비-JVM 메모리 오버헤드가 더 필요할 수 있습니다. 기본 프로필 이름만 보고 전체 프로세스 메모리가 충분하다고 판단하지 않습니다.

느린 작업과 실행기 수

작업이 충분히 병렬화되어 있다면 실행기 수를 늘려 동시에 처리할 태스크를 늘릴 수 있습니다. Builds의 태스크 동시성 그래프에서 실제 동시 태스크 수를 확인합니다. 실행기 수에도 미치지 못하는 수준이면 실행기만 더 추가해도 효과가 작을 수 있습니다.

다음 수치는 프로필 조정을 판단하는 경험적 기준입니다.

  • 실행기 수를 두 배로 늘렸을 때 실행 시간이 대략 3분의 1 이상 줄어드는지 봅니다. 예를 들어 6분이던 작업이 4분 이하가 되는지 비교합니다. 이득이 작으면 Catalog 읽기 및 쓰기 등 병렬화 외의 병목도 조사합니다.
  • 실행기 수를 절반으로 줄였을 때 시간이 약 50% 수준 이하로 증가하고 업무 지연 조건을 충족한다면 더 작은 구성을 선택할 수 있습니다. 4분에서 6분으로 늘어나는 경우가 예시입니다.
  • 128개 이상의 실행기를 쓰는 큰 프로필에는 승인된 업무만 사용하도록 제한이 있을 수 있습니다. 상한을 늘려야 하면 Palantir 담당자에게 요청합니다.

실행기 확보에도 시간이 걸립니다. 분당 약 10개 수준으로 자원이 추가되는 상황에서는 짧은 작업이 모든 실행기를 확보하기 전에 거의 끝날 수 있습니다. 예를 들어 10분 미만의 64실행기 작업은 32실행기 구성을 검토할 수 있습니다. 운영 권장으로는 15분 미만 작업에 64실행기를 쓰는 구성을 피하고 실제 시작 지연과 처리 이득을 비교합니다.

증상별 조정 방향

증상조사와 조정
로직 오류가 아닌 OOM 또는 shuffle 단계 실패실행기 메모리를 SMALL에서 MEDIUM으로 높이는 방안을 검토합니다. LARGE가 필요하면 전문가와 함께 로직 단순화 및 데이터 분포를 확인합니다.
많은 데이터를 드라이버로 수집하거나 큰 브로드캐스트 조인 사용드라이버 메모리를 검토합니다.
입력 파일이 많고 Spark 모듈이 응답하지 않음드라이버 메모리를 먼저 확인합니다. 계속되면 드라이버 코어 2개를 검토합니다.
많은 파일을 읽는 동안 GC 문제 발생드라이버 코어 2개를 검토합니다.

일반적인 연결 또는 실행기 종료 메시지만으로 OOM을 확정하지 않습니다. 메모리 오류 조사에서 원인과 처리 구간을 먼저 구분합니다.

관리자와 팀의 프로필 관리

기본값으로 충분하면 별도 프로필을 두지 않고, 필요하면 기본 제공 프로필을 우선 사용합니다. 사용자 지정 구성에는 담당자나 업무 이름을 넣어 누가 어떤 목적으로 만들었는지 알 수 있게 합니다. 종료된 업무의 사용자 지정 프로필은 더 이상 필요하지 않은지 확인하여 정리합니다.

자원을 많이 쓰는 프로필은 명시적인 승인 후 사용하도록 권한을 제한하는 것이 권장됩니다. 예를 들어 NUM_EXECUTORS_32, EXECUTOR_MEMORY_LARGE 이상이 대상입니다. EXECUTOR_CORES_SMALL 이외의 실행기 코어 설정도 엄격히 관리하고, 일반적으로는 코어 수보다 실행기 수로 병렬성을 조정하도록 안내합니다.

메모리 대 CPU 비율이 8:1을 넘는 구성을 승인 대상으로 둘 수 있습니다. EXECUTOR_CORES_SMALL과 EXECUTOR_MEMORY_MEDIUM 조합이 비교 기준이며, EXECUTOR_CORES_EXTRA_SMALL이나 EXECUTOR_MEMORY_LARGE 같은 설정의 허용 범위를 관리합니다.

프로필은 변수 하나 또는 하나의 논리적인 변수 조합을 바꾸도록 분리합니다. 같은 Spark 모듈에서 많은 작업을 동시에 실행하는 특별한 경우가 아니라면 드라이버 코어 기본값을 바꾸지 않는 것이 좋고, 실행기 코어 기본값도 드물게 변경하는 편이 권장됩니다.

실행 결과 확인

프로필을 바꾸면 Spark details에서 실행 시간, 동시성, shuffle과 메모리를 비교합니다. 추가 계획 정보는 Spark UI, 할당 자원별 산식과 예제는 Code Repositories 사용량에서 확인할 수 있습니다.