为REST服务中的每个端点创建单独的SparkSession

时间:2018-08-23 16:54:03

标签: java apache-spark spring-boot session

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

问题陈述:

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

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

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

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

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

    SparkContext sparkContext = SparkContext.getOrCreate(sparkCassandraConfig.sparkConf());
    
    SparkSession cloneSparkSession = sparkCassandraConfig.sparkSession(sparkContext).newSession();
    

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

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

cloneSparkSession.close();

问题:如果我依次调用服务,但这种方法可行,但是当服务并行运行时会失败。

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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