单个jvm中的多个sparksessions

6tqwzwtp  于 2021-05-27  发布在  Spark
关注(0)|答案(4)|浏览(466)

我有一个关于在一个jvm中创建多个spark会话的查询。我读过,在spark的早期版本中,不建议创建多个上下文。Spark2.0中的sparksession也是这样吗。
我正在考虑从ui调用web服务或servlet,然后该服务创建一个spark会话,执行一些操作并返回结果。这将导致为来自客户端的每个请求创建一个spark会话。建议这样做吗?
假设我有一个方法,比如:
public void runspark()引发异常{

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

等等。。。。
如果我把这个方法放在一个web服务中,会有jvm问题吗?因此,我可以从主方法多次调用此方法,但不确定这是否是一种好的做法。

ndasle7k

ndasle7k1#

如果您有一个现有的spark会话并希望创建一个新的spark会话,请对现有sparksession使用newsession方法。

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

newsession方法创建一个新的spark会话,其中包含独立的sql配置、临时表 SparkContext 和缓存数据。

yyyllmsg

yyyllmsg2#

文件 getOrCreate
此方法首先检查是否存在有效的线程本地sparksession,如果是,则返回该线程本地sparksession。然后检查是否存在有效的全局默认sparksession,如果是,则返回该sparksession。如果不存在有效的全局默认sparksession,则该方法将创建一个新的sparksession,并将新创建的sparksession指定为全局默认值。
还有方法 SparkSession.newSession 这表明
使用隔离的sql配置启动新会话,临时表、已注册的函数是隔离的,但共享基础sparkcontext和缓存数据。
所以,我猜你的问题的答案是,你可以有多个会议,但仍然有一个单一的 SparkContext 所有会话都将使用的每个jvm。
我可以想象,web应用程序的一个可能场景是创建一个 SparkSession 无论是每个请求或,例如http会话,并使用它来隔离每个请求或用户会话的spark执行<--因为我对spark很陌生--有人能确认这一点吗?

vhmi4jdf

vhmi4jdf3#

不支持也不会支持。spark-2243无法修复。
如果你需要多种环境,有不同的项目可以帮助你(米斯特,利维)。

ui7jx7zq

ui7jx7zq4#

你可以打电话 getOrCreate 多次。
此功能可用于 get or instantiate sparkcontext并将其注册为 singleton 对象。因为每个jvm只能有一个活动的sparkcontext,所以当应用程序希望共享一个 SparkContext .
getorcreate创建 SparkContext 如果没有 SparkContext 可用。如果sparkcontext在jvm中已经可用,它不会创建一个新的但是 returns the old one .

相关问题