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