我正在研究Java REST API,该API同时访问多个端点,并且所有这些服务并行运行。我希望我的应用程序为每个端点使用单独的SparkSession。

问题陈述:

每当我使用SparkSession.close()SparkSession.stop()停止sparkSession时,它都会关闭sparkContext本身,因为并行运行的其他服务会失败,并且只要我再次点击该服务,sparkContext就无法重新启动。

我尝试了以下方法来解决问题:


使用SparkSession单例对象,并使用SparkSession.cloneSession()SparkSession.newSession()为每个服务创建单独的SparkSession,然后调用SparkSession.close()SparkSession.stop()停止会话。


问题:停止SparkContext。不能重复或并行调用服务。


创建单个SparkContext对象,并调用java方法为每个服务创建SparkSession(而不是使用单例),如下所示:

SparkContext sparkContext = SparkContext.getOrCreate(sparkCassandraConfig.sparkConf());

SparkSession cloneSparkSession = sparkCassandraConfig.sparkSession(sparkContext).newSession();



其中sparkCassandraConfig是单例,它使用sparkConf()方法来获取所需的火花配置,并使用sparkSession(SparkContext)方法来构建SparkSession。

然后使用以下命令关闭会话:

cloneSparkSession.close();


问题:如果我顺序调用服务,则此方法有效,但当服务并行运行时失败。

任何人都可以为当前方法提出解决方案,或者是否有其他方法为每个端点创建单独的SparkSession。

任何帮助表示赞赏!

最佳答案

创建SparkSession作为静态块,并尝试使用val spark = SprakSession.getorcreate()方法获取SparkSession,不要在每个方法中都停止会话。

10-07 19:17