我有一个关于在一个JVM中创建多个spark会话的查询.我已经读过在早期版本的Spark中不建议创建多个上下文.Spark 2.0中的SparkSession也是如此.
我正在考虑从UI调用Web服务或servlet,该服务创建一个spark会话,执行一些操作并返回结果.这将导致为来自客户端的每个请求创建spark会话.这种做法是推荐的吗?
说我有一个类似的方法:
public void runSpark()抛出Exception {
SparkSession spark = SparkSession
.builder()
.master("spark://<masterURL>")
.appName("JavaWordCount")
.getOrCreate();
Run Code Online (Sandbox Code Playgroud)
等等....
如果我将此方法放在Web服务中,是否会出现任何JVM问题?因此,我可以从main方法多次调用此方法.但不确定这是否是一个好习惯.
Pet*_*ler 12
的文档getOrCreate状态
此方法首先检查是否存在有效的线程局部SparkSession,如果是,则返回该值.然后检查是否存在有效的全局默认SparkSession,如果是,则返回该值.如果不存在有效的全局默认SparkSession,则该方法将创建新的SparkSession并将新创建的SparkSession指定为全局默认值.
还有SparkSession.newSession指示的方法
使用隔离的SQL配置启动新会话,临时表,已注册的函数被隔离,但共享底层的SparkContext和缓存数据.
所以,我想你的问题的答案是,你可以有多个会话,但SparkContext每个JVM 仍然只有一个会被所有会话使用.
我可以想象,您的Web应用程序的可能情况可能是SparkSession每个请求创建一个,或者例如HTTP会话,并使用它来隔离每个请求或用户会话的Spark执行< - 因为我对Spark很新 - 可以有人证实这一点?
你可以
getOrCreate多次打电话.
此函数可用于get or instantiateSparkContext并将其注册为singleton对象.因为每个JVM只能有一个活动的SparkContext,所以当应用程序可能希望共享一个时,这很有用SparkContext.
SparkContext如果没有SparkContext可用的getOrCreate在JVM中创建.如果SparkContext 在JVM中已经可用,则它不会创建新的但是returns the old one.
如果您有一个现有的spark会话并想要创建一个新会话,请在现有的SparkSession上使用newSession方法.
import org.apache.spark.sql.{SQLContext, SparkSession}
val newSparkSession = spark.newSession()
Run Code Online (Sandbox Code Playgroud)
newSession方法使用隔离的SQL配置,临时表创建一个新的spark会话.新会话将共享底层SparkContext和缓存数据.
| 归档时间: |
|
| 查看次数: |
10097 次 |
| 最近记录: |