问题描述
如果您需要多个上下文,那么可以使用不同的项目来帮助您(Mist,Livy)。
文档getOrCreate
状态
此方法首先检查是否存在有效的线程本地SparkSession
,如果是,则返回该线程。然后,它检查是否存在有效的全局默认SparkSession
,如果是,则返回该默认值。如果不存在有效的全局默认SparkSession
,则该方法将创建一个新的SparkSession并将新创建的SparkSession
分配为全局默认值。
还有一种方法SparkSession.newSession
表明
使用隔离的sql配置开始新的会话,隔离临时表,注册的功能,但共享底层的SparkContext和缓存的数据。
因此,我想您问题的答案是,您可以有多个会话,但是SparkContext每个JVM仍将有一个会话供所有会话使用。
我能想象,一个用于Web应用程序可能的情形是创建一个SparkSession或者每个请求,或者如HTTP会话并用它来按照要求或用户会话隔离星火执行< -因为我很新的火花- CAN有人确认吗?
解决方法
我有一个关于在一个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方法多次调用此方法,但不确定这是否是一种好习惯。