我正在研究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,不要在每个方法中都停止会话。