我有一个关于在一个JVM中创建多个spark会话的查询。我已经读过在早期版本的Spark中不建议创建多个上下文。 Spark 2.0中的SparkSession也是如此。
我正在考虑从UI调用Web服务或servlet,该服务创建一个spark会话,执行一些操作并返回结果。这将导致为来自客户端的每个请求创建spark会话。这种做法是推荐的吗?
说我有一个类似的方法:
public void runSpark()抛出异常{
SparkSession spark = SparkSession
.builder()
.master("spark://<masterURL>")
.appName("JavaWordCount")
.getOrCreate();
依旧......
如果我将此方法放在Web服务中,是否会出现任何JVM问题?因此,我可以从main方法多次调用此方法。但不确定这是否是一种好的做法。
答案 0 :(得分:10)
getOrCreate
州的文件
此方法首先检查是否存在有效的线程本地 SparkSession,如果是的话,返回那个。然后检查是否 有一个有效的全局默认SparkSession,如果是,则返回该值 一。如果不存在有效的全局默认SparkSession,则该方法 创建一个新的SparkSession并分配新创建的SparkSession 作为全球默认。
还有方法SparkSession.newSession
表示
使用隔离的SQL配置启动一个临时的新会话 表,注册函数是隔离的,但共享底层 SparkContext和缓存数据。
所以,我想您的问题的答案是,您可以拥有多个会话,但每个JVM仍然只有一个SparkContext
将由您的所有会话使用。
我可以想象,您的网络应用程序的可能情况可能是每个请求创建一个SparkSession
,或者例如HTTP会话并使用它来隔离每个请求或用户会话的Spark执行&lt; - 因为我是Spark的新手 - 有人可以确认吗?
答案 1 :(得分:8)
您可以多次致电
getOrCreate
。
此函数可用于get or instantiate
SparkContext并将其注册为singleton
对象。因为每个JVM只能有一个活动的SparkContext,所以当应用程序可能希望共享SparkContext
时,这非常有用。
SparkContext
可用, getOrCreate 会在JVM中创建SparkContext
。如果在JVM中SparkContext已经可用,则它不会创建新的returns the old one
。
答案 2 :(得分:7)
它不受支持且不会成功。 SPARK-2243已解决为“无法修复”。
如果您需要多个上下文,可以使用不同的项目来帮助您(Mist,Livy)。
答案 3 :(得分:7)
如果您有现有的spark会话并想要创建新会话,请在现有SparkSession上使用 newSession 方法。
import org.apache.spark.sql.{SQLContext, SparkSession}
val newSparkSession = spark.newSession()
newSession方法使用独立的SQL配置,临时表创建一个新的spark会话。新会话将共享基础SparkContext
和缓存数据。