Spark 설정
Spark 설정 (Spark Configuration)
Spark 애플리케이션을 실행하기 전에 꼭 알아야 할 설정(Configuration) 방법을 정리한 페이지예요. Spark를 설정할 수 있는 세 가지 위치(Spark Properties, 환경 변수, 로깅 설정)와 함께, 애플리케이션 속성, 런타임 환경, 셔플, UI, 메모리 관리, 스케줄링 등 방대한 설정 항목들을 안내해 드릴게요.
출처: 문서
본문
목차 (Table of Contents)
- Spark Properties
- Spark Properties 동적 로딩
- Spark Properties 보기
- 사용 가능한 Properties
- Application Properties
- Runtime Environment
- Shuffle Behavior
- Spark UI
- Compression and Serialization
- Memory Management
- Execution Behavior
- Executor Metrics
- Networking
- Scheduling
- Barrier Execution Mode
- Dynamic Allocation
- Thread Configurations
- Spark Connect
- Security
- Spark SQL
- Spark Streaming
- SparkR (deprecated)
- GraphX
- Cluster Managers
- 환경 변수 (Environment Variables)
- 로깅 구성 (Configuring Logging)
- 설정 디렉터리 덮어쓰기
- Hadoop 클러스터 설정 상속
- 사용자 정의 Hadoop/Hive 설정
- 사용자 정의 리소스 스케줄링 및 구성 개요
- 스테이지 수준 스케줄링 개요
- Push 기반 셔플 개요
Spark는 시스템을 구성할 수 있는 세 가지 위치를 제공해요:
- Spark properties는 대부분의 애플리케이션 파라미터를 제어하며, SparkConf 객체나 Java 시스템 속성을 통해 설정할 수 있습니다.
- 환경 변수 (Environment variables)는 각 노드의
conf/spark-env.sh스크립트를 통해 IP 주소 같은 머신별 설정을 지정하는 데 사용할 수 있어요. - 로깅 (Logging)은
log4j2.properties를 통해 구성할 수 있습니다.
Spark Properties
Spark properties는 대부분의 애플리케이션 설정을 제어하며 각 애플리케이션마다 별도로 구성됩니다. 이러한 속성은 SparkContext에 전달하는 SparkConf에 직접 설정할 수 있어요. SparkConf를 사용하면 master URL과 애플리케이션 이름 같은 일반적인 속성뿐 아니라, set() 메서드를 통해 임의의 키-값 쌍도 구성할 수 있습니다. 예를 들어 두 개의 스레드로 애플리케이션을 초기화할 수 있어요:
참고로 local[2]로 실행한다는 것은 두 개의 스레드를 의미하는데, 이는 "최소한의" 병렬성을 나타내며 분산 컨텍스트에서 실행할 때만 존재하는 버그를 발견하는 데 도움이 될 수 있어요.
val conf = new SparkConf()
.setMaster("local[2]")
.setAppName("CountingSheep")
val sc = new SparkContext(conf)
로컬 모드에서 1개보다 많은 스레드를 가질 수 있고, Spark Streaming 같은 경우에는 기아(starvation) 문제를 막기 위해 실제로 1개 이상의 스레드가 필요할 수 있다는 점을 참고하세요.
시간 기간을 지정하는 속성은 시간 단위로 구성해야 합니다. 다음 형식이 허용돼요:
25ms (milliseconds)
5s (seconds)
10m or 10min (minutes)
3h (hours)
5d (days)
1y (years)
바이트 크기를 지정하는 속성은 크기 단위로 구성해야 해요. 다음 형식이 허용됩니다:
1b (bytes)
1k or 1kb (kibibytes = 1024 bytes)
1m or 1mb (mebibytes = 1024 kibibytes)
1g or 1gb (gibibytes = 1024 mebibytes)
1t or 1tb (tebibytes = 1024 gibibytes)
1p or 1pb (pebibytes = 1024 tebibytes)
단위 없는 숫자는 일반적으로 바이트로 해석되지만, 일부는 KiB나 MiB로 해석됩니다. 개별 설정 속성의 문서를 참고하세요. 가능하면 단위를 지정하는 것이 좋아요.
Spark Properties 동적 로딩 (Dynamically Loading Spark Properties)
어떤 경우에는 특정 설정을 SparkConf에 하드코딩하는 것을 피하고 싶을 수 있어요. 예를 들어 같은 애플리케이션을 서로 다른 master나 서로 다른 메모리 양으로 실행하고 싶다면요. Spark를 사용하면 간단히 빈 conf를 만들 수 있습니다:
val sc = new SparkContext(new SparkConf())
그런 다음 런타임에 설정 값을 제공할 수 있어요:
./bin/spark-submit \
--name "My app" \
--master "local[4]" \
--conf spark.eventLog.enabled=false \
--conf "spark.executor.extraJavaOptions=-XX:+PrintGCDetails -XX:+PrintGCTimeStamps" \
myApp.jar
Spark 셸과 spark-submit 도구는 설정을 동적으로 로드하는 두 가지 방법을 지원해요. 첫 번째는 위에서 본 것 같은 --master 같은 명령줄 옵션입니다. spark-submit은 --conf/-c 플래그를 사용해 어떤 Spark 속성도 받을 수 있지만, Spark 애플리케이션 실행에 관여하는 속성에는 특별한 플래그를 사용해요. ./bin/spark-submit --help를 실행하면 이 옵션들의 전체 목록을 볼 수 있어요.
설정이 --conf/-c 플래그로 지정되면 bin/spark-submit은 conf/spark-defaults.conf에서도 설정 옵션을 읽는데, 각 줄은 공백으로 구분된 키와 값으로 구성됩니다. 예:
spark.master spark://5.6.7.8:7077
spark.executor.memory 4g
spark.eventLog.enabled true
spark.serializer org.apache.spark.serializer.KryoSerializer
또한 Spark 설정이 있는 속성 파일을 --properties-file 파라미터로 bin/spark-submit에 전달할 수 있어요. 이것이 설정되면, 다른 파라미터 --load-spark-defaults가 제공되지 않는 한 Spark는 더 이상 conf/spark-defaults.conf에서 설정을 로드하지 않습니다.
플래그나 속성 파일에 지정된 값은 애플리케이션에 전달되어 SparkConf로 지정된 것과 병합됩니다. SparkConf에 직접 설정된 속성이 가장 높은 우선순위를 가지며, 그다음 spark-submit이나 spark-shell에 전달된 --conf 플래그나 --properties-file, 그다음 spark-defaults.conf 파일의 옵션 순이에요. 일부 설정 키는 이전 Spark 버전 이후로 이름이 바뀌었습니다. 이 경우 이전 키 이름도 여전히 허용되지만, 새 키의 어떤 인스턴스보다 낮은 우선순위를 가져요.
Spark 속성은 크게 두 가지 종류로 나눌 수 있어요. 하나는 "spark.driver.memory", "spark.executor.instances" 같은 배포 관련 속성입니다. 이런 속성은 런타임에 SparkConf로 프로그래밍 방식으로 설정해도 적용되지 않거나, 어떤 클러스터 관리자와 배포 모드를 선택하느냐에 따라 동작이 달라질 수 있어요. 따라서 설정 파일이나 spark-submit 명령줄 옵션으로 설정하는 것이 좋습니다. 다른 하나는 "spark.task.maxFailures" 같은 주로 Spark 런타임 제어와 관련된 속성으로, 어느 방식으로든 설정할 수 있어요.
Spark Properties 보기 (Viewing Spark Properties)
애플리케이션 웹 UI http://<driver>:4040의 "Environment" 탭에 Spark 속성이 나열됩니다. 여기서 속성이 올바르게 설정되었는지 확인하기 좋아요. spark-defaults.conf, SparkConf, 또는 명령줄을 통해 명시적으로 지정된 값만 표시된다는 점을 참고하세요. 다른 모든 설정 속성에 대해서는 기본값이 사용된다고 가정하면 됩니다.
사용 가능한 Properties (Available Properties)
내부 설정을 제어하는 대부분의 속성은 합리적인 기본값을 가져요. 설정할 수 있는 가장 일반적인 옵션 중 일부는 다음과 같습니다.
Application Properties
| 속성 이름 | 기본값 | 의미 | 도입 버전 |
|---|---|---|---|
spark.app.name |
(none) | 애플리케이션 이름. UI와 로그 데이터에 표시됩니다. | 0.9.0 |
이 밖에도 Runtime Environment, Shuffle Behavior, Spark UI, Compression and Serialization, Memory Management, Execution Behavior, Executor Metrics, Networking, Scheduling 등 많은 속성 그룹이 이어집니다. 각 항목은 "속성 이름 / 기본값 / 의미 / 도입 버전" 형식의 표로 정리돼 있어요. 자세한 내용은 Spark 공식 문서의 각 섹션을 참고하세요.
환경 변수 (Environment Variables)
환경 변수는 Spark가 시작될 때 머신별 설정을 지정하는 데 사용됩니다. conf/spark-env.sh에서 JAVA_HOME, PYSPARK_PYTHON, SPARK_LOCAL_DIRS 등을 설정할 수 있어요. 대부분의 환경 변수는 설정 파일에서 하는 것이 더 명확하지만, 일부는 환경 변수로만 설정할 수 있습니다.
로깅 구성 (Configuring Logging)
일반 텍스트 로깅
conf/log4j2.properties에서 로깅을 구성할 수 있어요. 루트 로거의 기본 레벨과 appender를 설정할 수 있습니다.
구조적 로깅
Spark는 JSON 형식의 구조적 로깅도 지원해요. log4j2.properties에서 spark.structuredLogging.enabled 같은 설정으로 활성화할 수 있고, Spark SQL로 구조적 로그를 조회할 수도 있습니다.
설정 디렉터리 덮어쓰기
기본 설정 디렉터리는 $SPARK_HOME/conf인데, SPARK_CONF_DIR 환경 변수로 다른 경로를 지정할 수 있어요.
Hadoop 클러스터 설정 상속
Spark는 Hadoop 클러스터의 hdfs-site.xml, core-site.xml, yarn-site.xml 설정을 상속받아 HDFS나 YARN에 접근할 수 있어요. Spark 애플리케이션을 실행하기 전에 HADOOP_CONF_DIR 또는 YARN_CONF_DIR이 설정되어 있는지 확인하세요.
사용자 정의 Hadoop/Hive 설정
Spark는 spark.hadoop.* 접두사로 Hadoop 설정을, spark.hive.* 접두사로 Hive 설정을 개별적으로 지정할 수 있어요. 예를 들어 spark.hadoop.fs.defaultFS처럼 지정하면 Spark가 해당 설정을 Hadoop에 전달합니다.
사용자 정의 리소스 스케줄링 및 구성 개요
Spark는 GPU, FPGA 같은 사용자 정의 리소스 유형을 스케줄링에 활용할 수 있어요. spark.{driver/executor}.resource.{resourceType}.amount 등의 설정으로 리소스를 요청할 수 있습니다.
스테이지 수준 스케줄링 개요
동적 할당과 함께 스테이지 수준에서 서로 다른 태스크 리소스 요구 사항을 지정할 수 있어요. 각 스테이지가 필요한 리소스에 따라 서로 다른 executors를 요청할 수 있습니다.
Push 기반 셔플 개요
Spark 3.0부터 Push 기반 셔플이 도입되었습니다. 셔플 데이터를 작성하는 쪽에서 미리 실행 중인 executor의 원격 저장소로 push해서 셔플을 가속화할 수 있어요. 서버 측과 클라이언트 측 설정 옵션이 각각 제공됩니다.
더 알아보기 (Learn more)
- 애플리케이션 제출 (Submitting Applications):
spark-submit으로 설정을 전달하는 방법을 알아봐요. - 튜닝 가이드 (Tuning Guide): 메모리 관리와 성능 최적화 설정을 다룹니다.
- YARN에서 Spark 실행:
spark.yarn.*설정 항목들을 확인해요.