KEEP GOING

[Spark] Spark Configuration 적용 방식(SparkConf, spark-shell, spark-default.conf)과 주 본문

bigdata/spark

[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 configuration
    Spark Configuration 2.4.4 docs

    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 namedefault meaningexample
    spark.driver.cores1driver가 사용할 코어 수
    cluster 모드에서만 유효함
    1~5
    spark.driver.memory1gdriver가 사용할 메모리 크기

    * client 모드에서는 드라이버 JVM이 이미 시작되기 때문에 spark app에서 SparkConf으로 설정 불가. 대신 --driver-class-path 실행 옵션이나 default 속성 파일으로 설정 가능 
    500m, 10g
    spark.driver.maxResultSize1gcollect 같은 spark action 결과값의 최대 크기 

    최소 1M 이상으로 설정하고 만약 제한이 없으면 0으로 지정함

    결과값이 설정값을 초과하면 작업이 중단됨
    설정값이 너무 높으면 드라이버에서 메모리 부족으로 오류가 발생함
    (spark.driver.memory 및 JVM 개체의 메모리 오버헤드에 따라 다름)

    적절한 제한 설정 시 메모리 부족 오류로부터 드라이버 보호 가능
    0, 1g, 1m
    spark.executor.memory1g각 executor의 메모리500m, 10g
    spark.driver.memoryOverheaddriverMemory * 0.10, (최소 384m)cluster 모드에서 driver당 할당할 오프힙 메모리의 양
    VM 오버헤드 등에 사용할 메모리
    (YARN과 Kubernetes에서 지원하는 옵션) 
     
    spark.executor.coresYARN 모드에서는 1각 executor 프로세스에서 사용할 코어 수 1~5
    spark.executor.memoryOverheadexecutorMemory * 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 namedefaultmeaningexample
    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 namedefaultmeaningexample
    spark.dynamicAllocation.enabledfalseDynamic Allocation 사용 여부에 대한 옵션
    (작업량에 따라 executor scale up/down하며 리소스 할당 조절)
    true, false
    spark.dynamicAllocation.initialExecutorsspark.dynamicAllocation.minExecutorsDynamic Allocation이 활성화된 경우, spark app 실행 시의 초기 executor 수 

    `--num-executors`(또는 `spark.executor.instances`)이 이 값보다 크면 초기 executor 수로 대체됨 
    3
    spark.dynamicAllocation.maxExecutorsinfinityDynamic Allocation이 활성화된 경우, 최대 executor 수3
    spark.dynamicAllocation.minExecutors0Dynamic 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

    반응형
    Comments