我正在研究Java REST API,该API同时访问多个端点,并且所有这些服务并行运行。我希望我的应用程序为每个端点使用单独的SparkSession。
问题陈述:
每当我使用SparkSession.close()
或SparkSession.stop()
停止sparkSession时,它都会关闭sparkContext本身,因为并行运行的其他服务会失败,并且当我再次点击该服务时sparkContext也无法重新启动。
我尝试了以下方法来解决问题:
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。
感谢您的帮助!
答案 0 :(得分:0)
将SparkSession创建为静态块,并尝试使用val spark = SprakSession.getorcreate()
方法获取SparkSession,不要在每种方法中都停止会话。