KEEP GOING
[Spark] Spark Configuration 적용 방식(SparkConf, spark-shell, spark-default.conf)과 주 본문
[Spark] Spark Configuration 적용 방식(SparkConf, spark-shell, spark-default.conf)과 주
jmHan 2023. 5. 9. 20:00목차
Spark Configuration(스파크 설정)
spark application의 동작 방식을 제어하기 위해서는 다양한 설정이 필요합니다. 이러한 설정은 spark-default.conf 파일, spark-shell 또는 spark-submit 옵션, SparkConf을 통해 수정할 수 있습니다. 만약 여러 property를 동시에 적용한 경우, 적용 우선 순위는 SparkConf, spark-shell, spark-submit, spark-default.conf 순입니다.
1. SparkConf 인스턴스 사용
from pyspark.sql import SparkSession
from pyspark.conf import SparkConf
conf = SparkConf().setMaster("local").setAppName("connect_SparkConf")
conf.set("property_name1", "value1") # cofig 추가 시
conf.set("property_name"2, "value2")
print(conf.get("spark.master")) #'local'
print(conf.get("spark.app.name")) #'jdbc_connect_test'
#spark dataframe 생성 시 cofig 적용
spark = SparkSession.builder.enableHiveSupport().config(conf=conf).getOrCreate()
print(spark.conf.get("spark.master")) #'local'
#rdd 생성 시 config 적용
sc = SparkContext(conf=conf)
print(sc.master) #'local'
SparkConfig 클래스는 property를 key, value 형태로 등록할 수 있는 set() 함수를 제공합니다.
만약 등록한 property를 확인하고 싶다면 get() 함수를 사용하면 됩니다.
SparkConfig를 적용할 경우, 리소스 할당과 같은 내용이 코드 로직과는 무관하게 항상 포함된다는 한계점이 있습니다.
따라서 spark 프로그램이 실행되는 시점에 동적으로 설정값을 세팅할 수 있는 두 가지 방법을 제공합니다.
2. spark-default.conf에 적용
spark 설치 경로에 존재하는 디렉터리인 conf/spark-default.conf 파일을 사용하여 동적으로 세팅할 수 있습니다.
3. spark-shell 또는 spark-submit 사용
spark-shell\
--master yarn\
--name "connect_shell"
--deploy-mode cluster\
--num-executors 4\
--executor-memory 4g\
--executor-cores 2\
--driver-memory 8g\
--driver-cores 4\
--conf spark.dynamicAllocation.enabled=true\
/home/user/python/script.py
마찬가지로 spark-shell을 이용하여 spark app을 제출할 때마다 원하는 설정값을 세팅할 수 있습니다.
Application Properties(어플리케이션 속성)
property name | default | meaning | example |
spark.driver.cores | 1 | driver가 사용할 코어 수 cluster 모드에서만 유효함 | 1~5 |
spark.driver.memory | 1g | driver가 사용할 메모리 크기 * client 모드에서는 드라이버 JVM이 이미 시작되기 때문에 spark app에서 SparkConf으로 설정 불가. 대신 --driver-class-path 실행 옵션이나 default 속성 파일으로 설정 가능 | 500m, 10g |
spark.driver.maxResultSize | 1g | collect 같은 spark action 결과값의 최대 크기 최소 1M 이상으로 설정하고 만약 제한이 없으면 0으로 지정함 결과값이 설정값을 초과하면 작업이 중단됨 설정값이 너무 높으면 드라이버에서 메모리 부족으로 오류가 발생함 (spark.driver.memory 및 JVM 개체의 메모리 오버헤드에 따라 다름) 적절한 제한 설정 시 메모리 부족 오류로부터 드라이버 보호 가능 | 0, 1g, 1m |
spark.executor.memory | 1g | 각 executor의 메모리 | 500m, 10g |
spark.driver.memoryOverhead | driverMemory * 0.10, (최소 384m) | cluster 모드에서 driver당 할당할 오프힙 메모리의 양 VM 오버헤드 등에 사용할 메모리 (YARN과 Kubernetes에서 지원하는 옵션) | |
spark.executor.cores | YARN 모드에서는 1 | 각 executor 프로세스에서 사용할 코어 수 | 1~5 |
spark.executor.memoryOverhead | executorMemory * 0.10, (최소 384m) | 각 executor당 할당할 오프힙 메모리의 양 VM 오버헤드 등에 사용할 메모리 (YARN과 Kubernetes에서 지원하는 옵션) | |
spark.master | (none) | 클러스터 매니저 정보 | yarn, local, local[*], spark://host:port, mesos://host:port, k8s://host:port, |
spark.submit.deployMode | (none) | spark 실행 시 driver 프로그램의 배포 방식(deploy mode) * client: 클러스터 외부에서 실행될 경우 * cluster: 클러스터 worker node 중 하나에서 실행될 경우 | client/cluster |
Runtime Environment(실행 환경)
property name | default | meaning | example |
spark.driver.extraClassPath | (none) | 드라이버 classpath에 추가할 항목 client 모드에서는 드라이버 JVM이 이미 시작되기 때문에 SparkConf으로 설정 불가능. 대신 --driver-class-path 실행 옵션이나 default.conf 파일으로 설정 가능 드라이버 실행 시 필요한 java 옵션이나 library 정보를 지정하는 용도로 사용함 | /usr/lib/hadoop-lzo/lib/* :/usr/lib/hadoop/hadoop-aws.jar :/usr/share/aws/aws-java-sdk/*$spark.driver.extraLibraryPath /usr/lib/hadoop/lib/native :/usr/lib/hadoop-lzo/lib/native :/docker/usr/lib/hadoop/lib/n$spark.executor.extraClassPath /usr/lib/hadoop-lzo/lib/* :/usr/lib/hadoop/hadoop-aws.jar :/usr/share/aws/aws-java-sdk/*$spark.executor.extraLibraryPath /usr/lib/hadoop/lib/native :/usr/lib/hadoop-lzo/lib/native :/docker/usr/lib/hadoop/lib/n$spark.eventLog.enabled |
spark.executor.extraClassPath | (none) | executor의 classpath에 추가할 항목 이전 버전의 Spark와의 호환성을 위해 존재함 일반적으로 사용자는 이 옵션을 설정할 필요가 없음 | |
spark.jars | driver와 executor의 클래스 경로(classpaths)에 올릴 jar 파일 ','로 구분하여 여러 파일 지정 |
Dynamic Allocation(동적 할당)
property name | default | meaning | example |
spark.dynamicAllocation.enabled | false | Dynamic Allocation 사용 여부에 대한 옵션 (작업량에 따라 executor scale up/down하며 리소스 할당 조절) | true, false |
spark.dynamicAllocation.initialExecutors | spark.dynamicAllocation.minExecutors | Dynamic Allocation이 활성화된 경우, spark app 실행 시의 초기 executor 수 `--num-executors`(또는 `spark.executor.instances`)이 이 값보다 크면 초기 executor 수로 대체됨 | 3 |
spark.dynamicAllocation.maxExecutors | infinity | Dynamic Allocation이 활성화된 경우, 최대 executor 수 | 3 |
spark.dynamicAllocation.minExecutors | 0 | Dynamic Allocation이 활성화된 경우, 최소 executor 수 | 5 |
참고)
https://spark.apache.org/docs/2.4.4/configuration.html
https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.SparkConf.html
https://sparkbyexamples.com/pyspark/spark-submit-python-file/
https://m.blog.naver.com/occidere/221609076332
'bigdata > spark' 카테고리의 다른 글
[pyspark] 한 column 내에서 중복인 value들을 확인하고 싶을 때 (0) | 2023.06.17 |
---|---|
[spark] pyspark datframe: filter 메서드 총 정리 (0) | 2023.06.09 |
[Spark][Tibero] ClassNotFoundException: com.tmax.tibero.jdbc.tbdriver 에러 해결 (0) | 2023.05.08 |
[Spark] 스파크 버전 확인하기 (0) | 2023.01.10 |
[Spark] Pyspark Dataframe 주요 메서드 샘플 정리(concat_ws, regexp_replace, explode, withColumnRenamed) (0) | 2022.12.21 |