Spark Session
是Spark 2.0
中Spark应用程序
的统一入口点。 它提供了一种以较少数量的构造与各种spark功能交互的方法。 此时就不需要spark context, hive context, SQL context
这些了,都包含在Spark Session
中了.
创建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
包含了SparkContext
,SparkContext
又包含了SparkConf
val spark: SparkSession = SparkSession.builder
.appName("SparkSessionExample")
.master("local[4]")
.config("spark.sql.warehouse.dir", "target/spark-warehouse")
.enableHiveSupport()
.getOrCreate
//SparkSession包含了SparkContext
val sparkContext: SparkContext = spark.sparkContext
//SparkContext包含了SparkConf
val conf: SparkConf = sparkContext.getConf
换一个例子看看
//首先构建sparkconf
val conf: SparkConf = new SparkConf().setAppName("wordcount").setMaster("local")
//通过sparkconf构建SparkContext
val sparkContext = new SparkContext(conf)
//通过SparkContext也能获取conf,这是必然的
val conf1: SparkConf = sparkContext.getConf
当我已经有了Spark Context时,为什么需要Spark Session?
答案的一部分是,它将Spark
中的所有不同上下文统一起来,并避免开发人员担心创建差异上下文
。 但是除了这个巨大的优势之外,当有多个用户使用同一个Spark上下文时,Spark的开发人员还试图解决该问题。
假设我们有多个用户访问共享了Spark Context
的同一个笔记本环境,并且要求有一个隔离的环境共享同一个Spark Context
。 在2.0之前的版本,解决方案是创建多个Spark Context
,即针对每个隔离的环境或用户创建Spark上下文,这是一项昂贵的操作(每个JVM通常为1)。 但是随着spark会话的介绍,此问题已得到解决。
总结
Spark Session
包含了Spark Context
Spark Context
包含了SparkConf
- 2.0 以后,记住用
SparkSession
就足够了,避免混淆
参考
A tale of Spark Session and Spark Context | by achilleus | Medium
https://medium.com/@achilleus/spark-session-10d0d66d1d24