개요
Spark 샘플 코드를 보면 데이터를 로드하고 처리하기 전에 SparkSession, SparkContext 객체를 선언하는 것으로 보인다. 각각 어떤 역할을 하는지 정리한다.
SparkContext
SparkContext는 Spark 1부터 사용할 수 있는 Spark 기능의 진입점에 해당한다. 클러스터에서 RDD, accumulators, 브로드캐스트 변수 등을 구축하는 데 사용하는 Spark 클러스터의 연결이라고 할 수 있다. SparkContext는 애플리케이션이 Resource Manager를 사용해 Spark 클러스터에 연결할 수 있게 한다. 참고로 SparkContext를 만들기 전에는 SparkConf 객체를 먼저 생성해야 한다.
import org.apache.spark.{SparkConf, SparkContext}
val conf = new SparkConf().setAppName("MyApp").setMaster("local")
val sc = new SparkContext(conf)
SparkContext의 기본 객체는 spark-shell에서 제공하고, 코드를 통해 직접 구성할 수 있다.
즉, SparkContext는 Spark 기능을 사용할 수 있게 해주는 도구라고 할 수 있다.
SparkSession
기존에는 주로 RDD를 다뤘기 때문에 SparkContext가 주요 진입점이었다. 따라서 Streaming을 위해서는 StreamingContext를, SQL을 쓸 때는 SQLContext를, Hive를 다룰 때는 HiveContext를 사용해야 했다. 하지만 DataFrame, DataSet을 추가로 다루게 되면서 Spark 2부터는 새로운 진입점이 필요하게 되었다.
SparkSession은 SparkContext 대신 Spark 2부터 사용할 수 있는 진입점으로 SQLContext, HiveContext 및 StreamingContext가 결합되었다. 각 context가 사용할 수 있는 API는 SparkSession에서도 사용할 수 있고, 실제 계산을 수행하는 SparkContext 역시 결합되어 있다.
Spark 2 이상에서도 SparkContext를 사용할 수 있지만, SparkSession에 다른 context가 포함되어 있기 때문에 SparkSession을 사용하는 것을 권장한다.
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder
.appName("SparkSessionExample")
.master("local[4]")
.config("spark.sql.warehouse.dir", "target/spark-warehouse")
.enableHiveSupport()
.getOrCreate()
SparkSession의 기본 객체는 spark-shell에서 제공하고, 코드를 통해 Builder 패턴으로 생성할 수 있다.
참고 문서
https://www.ksolves.com/blog/big-data/spark/sparksession-vs-sparkcontext-what-are-the-differences