-
Dynamically Loading Spark Properties(--master)Big Data 2022. 3. 6. 23:14
intellij에서 spark application을 실행할 때, cluster master url을 VM Option "-Dspark.master=local"로 세팅하고, application 내에서는 cluster master url이 dynamically loading 되게끔 코딩한다.
좀 더 상세히 설명하면..
spark application을 제출(spark-sumit) 할 때, 해당 job이 수행되는 클러스터의 master url을 지정해준다.
$spark-submit --class [class_name] --master [local, spark, mesos, yarn, k8s] ...
Submitting Applications - Spark 3.2.1 Documentation
Submitting Applications The spark-submit script in Spark’s bin directory is used to launch applications on a cluster. It can use all of Spark’s supported cluster managers through a uniform interface so you don’t have to configure your application esp
spark.apache.org
application 내 spark context 생성 시, master를 아래와 같이 hardcoding으로 지정해 줄 수도 있다.
## 1. sparkContext - setMaster val sparkConf = new SparkConf().setAppName("SimpleApp").setMaster("local[*]") val sc = new SparkContext(sparkconf) ## 2-1. sparkSession - master val ss = SparkSession.builder.appName("SimpleApp").master("local") ## 2-2. sparkSession - config val ss = SparkSession.builder.appName("SimpleApp").config("spark.master", "local")
그러나 production까지 배포가 되는 코드라면, dev/stg/prod 환경에 따라 해당 job이 수행되어야 하기 때문에 적절하지는 않다. 그래서 dynamically loading이 되게끔 master 관련 설정은 skip 한다.
- 상세 참조 : https://spark.apache.org/docs/latest/configuration.html#dynamically-loading-spark-properties
Configuration - Spark 3.2.1 Documentation
Spark Configuration Spark provides three locations to configure the system: Spark properties control most application parameters and can be set by using a SparkConf object, or through Java system properties. Environment variables can be used to set per-mac
spark.apache.org
하지만, IDE에서 개발을 하는 경우라면 불편함이 생긴다.
application에서 sparkContext, sparkSession의 master를 skip 하면 compile/build는 무리 없이 성공되지만, 실행단계에서(tool 내에서 run 하게 되면) master url이 지정이 안되어 있기 때문에 실행은 되지 않는다. 그렇다고 매번 IDE에서 build 하고, 실행은 terminal로 손과 시선을 옮겨서 spark-submit를 하기도 무척 번거롭다.
몇몇 책과 샘플코드에서는 맨 위에 언급한 거처럼 하드코딩을 하거나 argument로 처리한다.
production용으로 부적절하여, 오랫동안 삽질을 하다가 찾아낸 방법은 run configuration에서 VM option으로 "-Dspark.master=local [*]"을 주면 된다.
local에서 개발할때는 이 옵션으로 실행/단위 테스트까지 하고, 서버로 배포 후 spark-sumit 옵션(--master)나 conf/spark-defaults.conf 에 정의된 환경대로 수행하면 된다.