SPARK_DAEMON_JAVA_OPTS
SPARK_DAEMON_JAVA_OPTS는 Spark의 “데몬 프로세스(daemon processes)”에 적용될 JVM 옵션을 지정하는 환경 변수임.
여기서 “데몬 프로세스”란 Spark Master, Spark Worker, Spark History Server 등과 같이 장기간 동작하면서 클러스터/작업을 관리하거나 모니터링하는 Spark의 백그라운드 프로세스를 말함.
Spark Driver나 Executor 프로세스와는 별도로, Spark 클러스터 자체를 운영하기 위한 프로세스에 적용되는 설정이라는 점이 핵심임.
SPARK_DAEMON_JAVA_OPTS의 역할
1. Spark 마스터와 워커, 히스토리 서버 등에 공통적으로 적용
Spark에는 Master, Worker, History Server 등 여러 데몬 프로세스가 있음..
SPARK_DAEMON_JAVA_OPTS에 설정된 값들은 이들 프로세스가 기동될 때 JVM 시작 파라미터로 전달됨.
예를 들어, GC 세팅(-XX:+UseG1GC), 힙 메모리 크기(-Xmx), JMX 설정(-Dcom.sun.management.jmxremote=...) 등을 일괄 적용할 수 있음.
2. Driver/Executor와 구분
주의할 점은, Spark 애플리케이션의 Driver(예: spark-submit 시 실행되는 Driver)와 Executor 프로세스에 적용되는 JVM 옵션은 SPARK_DAEMON_JAVA_OPTS가 아닌 다른 옵션으로 관리함.
즉, SPARK_DAEMON_JAVA_OPTS는 오직 데몬 프로세스용 옵션이고, 애플리케이션 런타임 프로세스와는 별도로 관리됨.
Driver용 옵션: SPARK_DRIVER_MEMORY, SPARK_DRIVER_EXTRA_JAVA_OPTIONS, etc.
Executor용 옵션: SPARK_EXECUTOR_MEMORY, SPARK_EXECUTOR_EXTRA_JAVA_OPTIONS, etc.
설정 방법 및 예시
Spark 설치 디렉토리 하위의 conf/spark-env.sh 파일(또는 해당 파일이 로드하는 환경 스크립트)에 다음과 같이 설정할 수 있음.
# spark-env.sh 예시
export SPARK_DAEMON_JAVA_OPTS="\
-Xms1g \
-Xmx2g \
-XX:+UseG1GC \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9090 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Djava.rmi.server.hostname=0.0.0.0 \
-Dlogging.level=INFO
"
-Xms, -Xmx: 데몬 프로세스 JVM Heap 최소/최대 크기 설정
-XX:+UseG1GC: GC 알고리즘 설정(G1GC 사용)
-Dcom.sun.management.jmxremote=...: JMX 모니터링 활성화
-Djava.rmi.server.hostname: 원격 JMX 접속 시 사용할 호스트명 or IP
-Dlogging.level=INFO: 로그 레벨, 로깅 프레임워크 관련 설정
이처럼 여러 JVM 파라미터를 공백으로 구분해서 하나의 문자열로 정의하고, export SPARK_DAEMON_JAVA_OPTS="..." 형태로 설정하면 됨.
데몬 프로세스별 메모리 설정 시나리오
1. Spark Master
Master는 클러스터 리소스와 Worker 정보를 관리하고, Worker에게 Executor 할당 등 스케줄링 요청을 수행함.
일반적으로 Master 프로세스가 데이터를 많이 로드하지 않기 때문에, 지나치게 큰 Heap은 필요 없음.
1~2GB 정도의 Heap을 설정하면 대부분의 상황에서 충분하지만, 워크로드나 스케줄링 이벤트가 매우 많은 경우(수천~수만 개의 Spark 애플리케이션)라면 더 높게 잡을 수도 있음.
2. Spark Worker
Worker 프로세스 역시 실질적으로 데이터를 처리하지 않고, 각 Worker가 생성한 Executor 컨테이너가 데이터를 처리함.
Worker는 Executor 관리, 상태 보고, 로그 수집 등을 담당하므로 Heap 크기는 Master와 비슷하거나 조금 더 크게 설정할 수 있음.
Executor 프로세스는 별도 JVM으로 구동되고, Worker는 Executor 프로세스들을 관할하는 역할이므로 Worker 자체도 보통 1~4GB 정도면 충분함.
3. History Server
Spark History Server는 완료된(혹은 진행 중인) 애플리케이션 로그(이벤트 로그)를 읽어 UI로 제공함.
로그가 매우 많거나(수십~수백 GB), 분석할 애플리케이션 히스토리 파일이 큰 경우 Heap이 부족해서 OOM이 날 수 있음.
이 경우에는 SPARK_DAEMON_JAVA_OPTS를 통해 History Server용 Heap을 더 높게(-Xmx8g 등) 잡아야 할 수 있음.
자주 활용하는 JVM 옵션
1. Heap 메모리 관련: -Xms, -Xmx
데몬 프로세스가 처리해야 하는 메타데이터나 로그 크기에 따라 적절히 설정.
지나치게 크게 잡으면 오히려 GC 부담이 증가할 수 있으므로, 모니터링과 함께 조절.
2. GC 알고리즘: -XX:+UseG1GC, -XX:+UseParallelGC, etc.
Spark Master/Worker의 경우, G1GC나 Parallel GC가 일반적.
GC 튜닝이 필요한 워크로드에서는 다양한 파라미터(-XX:+ParallelRefProcEnabled, -XX:MaxGCPauseMillis, 등)를 추가로 설정.
3. JMX 모니터링: -Dcom.sun.management.jmxremote
Spark 데몬 프로세스의 Heap, GC, 스레드 상태 등을 모니터링하려면 필수.
보안(SSL, 인증) 설정을 고려해야 함.
4. 로그 레벨 및 로깅 경로
-Dlog4j.configuration=file:/path/to/log4j.properties
-Dlogging.level=INFO 같은 방식으로 로그 레벨을 지정해, INFO/DEBUG 등 세분화
5. 기타 디버깅/프로파일링 옵션
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 (원격 디버깅)
-XX:+FlightRecorder (Java Flight Recorder 활성화) 등
모범 사례
1. 프로세스별 맞춤 메모리 설정
SPARK_DAEMON_JAVA_OPTS는 모든 데몬 프로세스에 공통으로 적용되므로, 간혹 Master/Worker/History Server 각각 필요 메모리가 다를 수 있음.
만약 Master/Worker/HistoryServer 별로 별도 세팅이 필요하다면, SPARK_MASTER_OPTS, SPARK_WORKER_OPTS, SPARK_HISTORY_OPTS 등의 변수를 사용해 세분화하는 방식을 고려할 수 있음.
2. spark-env.sh vs. 클러스터 매니저
스탠드얼론 모드일 경우 spark-env.sh에서 직접 설정하지만, YARN 모드(EMR 포함)에서는 YARN ResourceManager나 NodeManager가 Spark 데몬 역할을 대체할 수도 있음.
EMR 환경에서는 /etc/spark/conf/spark-env.sh 또는 부트스트랩 액션을 통해 동일한 원리로 설정 가능.
3. GC 튜닝 및 모니터링 도구 연동
장기간 유지되는 Spark Master/Worker나 History Server에서 GC 문제가 발생하면 클러스터 전체에 영향이 갈 수 있음.
실시간 모니터링(JMX → Prometheus/Grafana, Datadog, CloudWatch Agent 연동)으로 Heap/GC 지표를 추적해야 함.
4. 클러스터 크기 대비 적절한 자원 할당
데몬 프로세스가 지나치게 많은 메모리를 사용하면, 정작 애플리케이션(Driver, Executor) 쪽에 할당할 리소스가 부족해짐.
반대로 데몬 프로세스에 너무 적은 메모리를 줄 경우, 많은 애플리케이션/로그/메타데이터를 처리하다가 OutOfMemoryError가 발생할 수 있음.
정리
SPARK_DAEMON_JAVA_OPTS는 Spark 클러스터의 데몬 프로세스(Master, Worker, History Server)에 적용되는 공통 JVM 옵션을 지정하는 핵심 환경 변수임.
일반적으로 spark-env.sh에서 설정하며, GC, Heap 메모리 크기, JMX, 로깅 등 다양한 파라미터를 일괄 적용해 운영 환경을 튜닝할 수 있음.
단, Driver나 Executor 프로세스에는 다른 옵션 변수가 적용되므로, 목적(데몬 vs. 애플리케이션)에 따라 구분해서 설정해야 함.
실제 운영에서는 프로세스별 필요한 메모리를 신중하게 산정하고, 보안 및 모니터링(예: JMX) 설정을 병행하여 안정적인 Spark 클러스터를 구성하는 것이 중요함.
'Cloud > AWS' 카테고리의 다른 글
[AWS] EMR JVM 모니터링 (0) | 2025.01.14 |
---|---|
[AWS] 파이썬으로 EMR 클러스터 생성 (0) | 2025.01.14 |
[AWS] EMR의 유형별 노드 (0) | 2025.01.14 |
[AWS] EMR(Elastic MapReduce) 개념 (1) | 2025.01.14 |
[AWS] istio (0) | 2024.12.08 |