单个JVM中的多个SparkSession

时间:2016-10-20 11:55:37

标签: apache-spark

我有一个关于在一个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();

依旧......

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

4 个答案:

答案 0 :(得分:10)

getOrCreate州的文件

  

此方法首先检查是否存在有效的线程本地   SparkSession,如果是的话,返回那个。然后检查是否   有一个有效的全局默认SparkSession,如果是,则返回该值   一。如果不存在有效的全局默认SparkSession,则该方法   创建一个新的SparkSession并分配新创建的SparkSession   作为全球默认。

还有方法SparkSession.newSession表示

  

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

所以,我想您的问题的答案是,您可以拥有多个会话,但每个JVM仍然只有一个SparkContext将由您的所有会话使用。

我可以想象,您的网络应用程序的可能情况可能是每个请求创建一个SparkSession,或者例如HTTP会话并使用它来隔离每个请求或用户会话的Spark执行&lt; - 因为我是Spark的新手 - 有人可以确认吗?

答案 1 :(得分:8)

  

您可以多次致电getOrCreate

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

如果没有SparkContext可用,

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

答案 2 :(得分:7)

它不受支持且不会成功。 SPARK-2243已解决为“无法修复”。

如果您需要多个上下文,可以使用不同的项目来帮助您(Mist,Livy)。

答案 3 :(得分:7)

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

import org.apache.spark.sql.{SQLContext, SparkSession}
val newSparkSession = spark.newSession()

newSession方法使用独立的SQL配置,临时表创建一个新的spark会话。新会话将共享基础SparkContext和缓存数据。