Percy

单个JVM中有多个SparkSession

java

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

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

说我有一个类似的方法:

public void runSpark()引发异常{

        SparkSession spark = SparkSession
          .builder()
          .master("spark://<masterURL>")
          .appName("JavaWordCount")
          .getOrCreate();

等等....

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


阅读 604

收藏
2020-12-06

共2个答案

一尘不染

不支持,也不会。SPARK-2243解决为“无法修复”。

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

2020-12-06
一尘不染

文档getOrCreate状态

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

还有一种方法SparkSession.newSession表明

使用隔离的SQL配置开始新的会话,隔离临时表,注册的功能,但共享底层的SparkContext和缓存的数据。

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

我能想象,一个用于Web应用程序可能的情形是创建一个SparkSession或者每个请求,或者如HTTP会话并用它来按照要求或用户会话隔离星火执行< -因为我很新的火花- CAN有人确认吗?

2020-12-06