单个JVM中的多个SparkSession

Ris*_*i S 13 apache-spark

我有一个关于在一个JVM中创建多个spark会话的查询.我已经读过在早期版本的Spark中不建议创建多个上下文.Spark 2.0中的SparkSession也是如此.

我正在考虑从UI调用Web服务或servlet,该服务创建一个spark会话,执行一些操作并返回结果.这将导致为来自客户端的每个请求创建spark会话.这种做法是推荐的吗?

说我有一个类似的方法:

public void runSpark()抛出Exception {

        SparkSession spark = SparkSession
          .builder()
          .master("spark://<masterURL>")
          .appName("JavaWordCount")
          .getOrCreate();
Run Code Online (Sandbox Code Playgroud)

等等....

如果我将此方法放在Web服务中,是否会出现任何JVM问题?因此,我可以从main方法多次调用此方法.但不确定这是否是一个好习惯.

Pet*_*ler 12

的文档getOrCreate状态

此方法首先检查是否存在有效的线程局部SparkSession,如果是,则返回该值.然后检查是否存在有效的全局默认SparkSession,如果是,则返回该值.如果不存在有效的全局默认SparkSession,则该方法将创建新的SparkSession并将新创建的SparkSession指定为全局默认值.

还有SparkSession.newSession指示的方法

使用隔离的SQL配置启动新会话,临时表,已注册的函数被隔离,但共享底层的SparkContext和缓存数据.

所以,我想你的问题的答案是,你可以有多个会话,但SparkContext每个JVM 仍然只有一个会被所有会话使用.

我可以想象,您的Web应用程序的可能情况可能是SparkSession每个请求创建一个,或者例如HTTP会话,并使用它来隔离每个请求或用户会话的Spark执行< - 因为我对Spark很新 - 可以有人证实这一点?


bob*_*bob 8

你可以getOrCreate多次打电话.

此函数可用于get or instantiateSparkContext并将其注册为singleton对象.因为每个JVM只能有一个活动的SparkContext,所以当应用程序可能希望共享一个时,这很有用SparkContext.

SparkContext如果没有SparkContext可用的getOrCreate在JVM中创建.如果SparkContext 在JVM中已经可用,则它不会创建新的但是returns the old one.


mor*_*007 8

如果您有一个现有的spark会话并想要创建一个新会话,请在现有的SparkSession上使用newSession方法.

import org.apache.spark.sql.{SQLContext, SparkSession}
val newSparkSession = spark.newSession()
Run Code Online (Sandbox Code Playgroud)

newSession方法使用隔离的SQL配置,临时表创建一个新的spark会话.新会话将共享底层SparkContext和缓存数据.


小智 7

它不受支持也不会支持.SPARK-2243已解决为无法修复.

如果你需要多个上下文,有不同的项目可以帮助你(Mist,Livy).