Apache spark 单个JVM中的多个SparkSession

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

我有一个关于在一个JVM中创建多个spark会话的问题。我已经读到,在Spark的早期版本中,不建议创建多个上下文。Spark 2.0中的SparkSession也是如此吗

我正在考虑从UI调用web服务或servlet,该服务创建一个spark会话,执行一些操作并返回结果。这将导致为客户端的每个请求创建spark会话。建议这样做吗

假设我有一个类似以下的方法:

public void runSpark()引发异常{

        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之前是受支持的,但现在该支持已被删除,因为它会导致任意问题。