[Spark] PySpark에서 Spark 세션 생성

Spark Session

  • 프로그램 마다 하나를 만들어서 Spark Cluster와 통신(Singleton 객체)
  • DataFrame, SQL, Streaming, ML API 모두 통신
  • config 메소드를 통해 환경설정 가능
  • RDD 관련 작업은 SparkSession 밑에 sparkContext 객체 사용

Spark 세션 생성

from pyspark.sql import SparkSession

 

SparkSession은 디자인 패턴 builder의 싱글턴 패턴 사용

  • .getOrCreate() 한 프로그램에 하나의 오퍼레이터만 있으면 된다
spark = SparkSession.builder.master("local[*]").appName("앱이름").getOrCreate()

 

세션 종료

spark.stop()

 

드라이버 상에 Spark세션을 생성해서 Spark Cluster에 있는 Cluster Manager과 통신을 하게 되고 

Cluster Manager에게 명령을 내리고 이를 executor가 실행합니다.

Spark Session 환경 변수

  • spark.executor.memory executor별 메모리(기본값 1g)
  • spark.executor.cores executor별 CPU수(YARN에서는 기본값 1)
  • spark.driver.memory driver 메모리(기본값 1g)
  • spark.sql.shuffle.partitions Shuffle후 Partition의 수(기본값 최대 200)

환경 변수 설정 방법

1. 환경변수
2. $SPARK_HOME/conf/spark_defaults.conf
3. spark-submit 명령의 커맨드라인 파라미터
4. SparkSession 만들때 지정

환경 변수 충돌시 우선순위가 가장 높은 순서는 4 > 3 > 2 > 1

 

1,2번의 경우 보통 Spark Cluster 어드민이 관리.

3번의 경우 spark-submit --master "local[3]" [파일명].py 와 같이 실행.

4번의 경우 1) 빌더 디자인패턴을 사용하거나 2) SparkConf라는 사용해서 SparkSession에 파라미터로 넘겨줌

 

1) SparkSession 만들때 일일이 지정

우선순위가 정해진 형태로 이미 들어가 있고 지정한 내용은 overwrite되어 들어감

spark = SparkSession.builder.master("local[*]").appName("앱이름").config("spark.some.config.option1", "some-value").config("spark.some.config.option1", "some-value").getOrCreate()

2) SparkConf 객체를 만들어서 환경 설정하고 SparkSession에 지정

from pyspark import SparkConf
conf = SparkConf()
conf.set("spark.app.name", "PySpark Tutorial")
conf.set("spark.master", "local[*]")
spark = SparkSession.builder.config(config=conf).getOrCreate()

 

전체적인 플로우

Spark Session을 만들고 환경변수 설정을 해준뒤 ➡️ SparkSession API로 입력데이터를 로딩한다(이경우 주로 데이터프레임 ➡️  DataFrame API나 Spark SQL을 사용해서 Spark Cluster 내에서 데이터 조작 작업(원하는 결과 나올때까지 새로운 DataFrame 생성)  ➡️ 최종적으로 결과를 HDFS나 RDBMS, Hive에 저장

 

 

참고

https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/spark_session.html

https://spark.apache.org/docs/latest/configuration.html#application-properties