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

标签 java apache-spark spring-boot session

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

问题陈述:

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

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

  1. 使用 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/

    相关文章:

    apache-spark - IN子句中的Spark SQL限制

    java - 无法计算表达式方法抛出 'org.hibernate.exception.GenericJDBCException' 异常

    java - 为什么我收到此错误 "EmbeddedServletContainerInitializedEvent cannot be resolved to a type"?

    java - 如何选择SD卡中的文件?

    java - 通过tomcat运行unix命令

    apache-spark - 如何使用自签名证书保护的 S3 (Minio) 运行 Apache Spark?

    java - 如何过滤Eureka服务器中的Eureka客户端?

    java - 如何将 JSONArray 转换为 ListView?

    java - 如何在 Java 中将 RegEx 表达式作为参数传递?

    apache-spark - 用 kubernetes 代替 yarn 激发 Spark