Apache spark 单个JVM中的多个SparkSession
我有一个关于在一个JVM中创建多个spark会话的问题。我已经读到,在Spark的早期版本中,不建议创建多个上下文。Spark 2.0中的SparkSession也是如此吗 我正在考虑从UI调用web服务或servlet,该服务创建一个spark会话,执行一些操作并返回结果。这将导致为客户端的每个请求创建spark会话。建议这样做吗 假设我有一个类似以下的方法: public void runSpark()引发异常{Apache spark 单个JVM中的多个SparkSession,apache-spark,Apache Spark,我有一个关于在一个JVM中创建多个spark会话的问题。我已经读到,在Spark的早期版本中,不建议创建多个上下文。Spark 2.0中的SparkSession也是如此吗 我正在考虑从UI调用web服务或servlet,该服务创建一个spark会话,执行一些操作并返回结果。这将导致为客户端的每个请求创建spark会话。建议这样做吗 假设我有一个类似以下的方法: public void runSpark()引发异常{ SparkSession spark = SparkSessi
SparkSession spark = SparkSession
.builder()
.master("spark://<masterURL>")
.appName("JavaWordCount")
.getOrCreate();
SparkSession spark=SparkSession
.builder()
.master(“火花:/”)
.appName(“JavaWordCount”)
.getOrCreate();
等等
如果我把这个方法放在一个web服务中,会不会有JVM问题?因此我可以从一个主方法多次调用这个方法。但不确定这是否是一个好的实践
您可以多次调用getOrCreate
此函数可用于获取或实例化SparkContext,并将其注册为单例对象。因为每个JVM只能有一个活动的SparkContext,所以当应用程序可能希望共享SparkContext
时,此函数非常有用
getOrCreate在JVM中创建一个SparkContext
,如果没有可用的SparkContext
。如果在JVM中已有可用的SparkContext,它不会创建新的,但返回旧的,它不受支持,也不会被解析为无法修复
如果您需要多个上下文,有不同的项目可以帮助您(Mist,Livy)。获取或创建的文档说明
此方法首先检查是否存在有效的本地线程
SparkSession,如果是,则返回该会话。然后检查
存在有效的全局默认SparkSession,如果是,则返回该值
如果不存在有效的全局默认SparkSession,则该方法
创建新的SparkSession并分配新创建的SparkSession
作为全局默认值
还有一种方法SparkSession.newSession
,表示
使用独立的SQL配置临时启动新会话
表、注册函数是隔离的,但共享底层
SparkContext和缓存数据
因此,我想您的问题的答案是,您可以有多个会话,但每个JVM仍有一个SparkContext
,将由您的所有会话使用
我可以想象,web应用程序的一个可能场景是,每个请求或(例如)HTTP会话创建一个SparkSession
,并使用它来隔离每个请求或用户会话的Spark执行如果您有一个现有Spark会话,并希望创建一个新会话,请使用newSession方法在现有SparkSession上
import org.apache.spark.sql.{SQLContext, SparkSession}
val newSparkSession = spark.newSession()
newSession方法使用独立的SQL配置、临时表创建新的spark会话。新会话将共享底层的SparkContext
和缓存数据。我创建了另一个与此密切相关的问题。请看,由于该问题涉及SparkSessions,因此需要指出的是可以运行多个SparkSession
s,但每个JVM只能运行一个SparkContext
。此外,如果我们看一下,这在Spark 3.0.0之前是受支持的,但现在该支持已被删除,因为它会导致任意问题。