我正在开发一个 Java REST API,它同时访问多个端点,并且所有这些服务并行运行。我希望我的应用程序为每个端点使用单独的 SparkSession。
问题陈述:
每当我使用 SparkSession.close()
或 SparkSession.stop()
停止 SparkSession 时,它都会关闭 SparkContext 本身,因为并行运行的其他服务会失败,并且每当我再次点击该服务时,sparkContext 都无法重新启动。
我尝试了以下方法来解决该问题:
- 使用 SparkSession 单例对象,并使用
SparkSession.cloneSession()
或SparkSession.newSession()
为每个服务创建单独的 SparkSession,并调用SparkSession.close()
或SparkSession.stop()
停止 session 。
问题:停止 SparkContext。无法重复或并行调用服务。
创建单独的 SparkContext 对象并调用 java 方法为每个服务创建 SparkSession(而不是使用单例),如下所示:
SparkContext sparkContext = SparkContext.getOrCreate(sparkCassandraConfig.sparkConf()); SparkSession cloneSparkSession = sparkCassandraConfig.sparkSession(sparkContext).newSession();
其中 sparkCassandraConfig
是一个单例,它使用 sparkConf()
方法获取所需的 Spark 配置,并使用 sparkSession(SparkContext)
方法构建 SparkSession。
然后使用以下命令关闭 session :
cloneSparkSession.close();
问题:如果我顺序调用服务,此方法有效,但当服务并行运行时,此方法会失败。
任何人都可以建议当前方法的解决方案,或者是否有任何其他方法可以为每个端点创建单独的 SparkSession。
感谢任何帮助!
最佳答案
将 SparkSession 创建为静态 block ,并尝试使用 val spark = SprakSession.getorcreate()
方法获取 SparkSession,不要在每个方法中停止 session 。
关于java - 为 REST 服务中的每个端点创建单独的 SparkSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51990778/