我有一个关于在一个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问题吗?因此,我可以从主方法多次调用此方法,但不确定这是否是一种好的做法。
4条答案
按热度按时间ndasle7k1#
如果您有一个现有的spark会话并希望创建一个新的spark会话,请对现有sparksession使用newsession方法。
newsession方法创建一个新的spark会话,其中包含独立的sql配置、临时表
SparkContext
和缓存数据。yyyllmsg2#
文件
getOrCreate
州此方法首先检查是否存在有效的线程本地sparksession,如果是,则返回该线程本地sparksession。然后检查是否存在有效的全局默认sparksession,如果是,则返回该sparksession。如果不存在有效的全局默认sparksession,则该方法将创建一个新的sparksession,并将新创建的sparksession指定为全局默认值。
还有方法
SparkSession.newSession
这表明使用隔离的sql配置启动新会话,临时表、已注册的函数是隔离的,但共享基础sparkcontext和缓存数据。
所以,我猜你的问题的答案是,你可以有多个会议,但仍然有一个单一的
SparkContext
所有会话都将使用的每个jvm。我可以想象,web应用程序的一个可能场景是创建一个
SparkSession
无论是每个请求或,例如http会话,并使用它来隔离每个请求或用户会话的spark执行<--因为我对spark很陌生--有人能确认这一点吗?vhmi4jdf3#
不支持也不会支持。spark-2243无法修复。
如果你需要多种环境,有不同的项目可以帮助你(米斯特,利维)。
ui7jx7zq4#
你可以打电话
getOrCreate
多次。此功能可用于
get or instantiate
sparkcontext并将其注册为singleton
对象。因为每个jvm只能有一个活动的sparkcontext,所以当应用程序希望共享一个SparkContext
.getorcreate创建
SparkContext
如果没有SparkContext
可用。如果sparkcontext在jvm中已经可用,它不会创建一个新的但是returns the old one
.