【发布时间】:2021-11-09 00:52:38
【问题描述】:
我有一个与 Apache Spark 相关的问题。我使用 Java 语言编写客户端代码,但我的问题可以用任何语言回答。
问题的标题看起来好像谷歌里已经有一个一般的问题,可以通过简单的搜索找到,但问题是我的问题是别的东西,不幸的是每次我搜索时,我都没有找到关于这个话题和我的要求。通常通过搜索找到但不是我的问题的类似主题是:
- 一个 SparkContext 的多个 SparkSession
- 单个 JVM 中的多个 SparkSessions
- ...
我的问题根本不是上述问题,虽然看起来很相似。我将首先解释我的问题。下面,在陈述完问题后,我将在更高的层次上说我的要求,因此我提出了这个问题。我的目标是,如果问题得到解答或提供了其他解决方案,则该要求将得到解决。
我要解决的问题
我编写了一个使用 Spark Java 库的 REST 服务器组件。这个 rest server 可以接收一系列特定格式的请求,然后根据请求形成查询,并通过 Spark 库函数向 Spark 集群提交作业。 (我自己的集群)也以异步响应的形式返回查询答案(当它准备好并且用户请求它时)。
我使用这样的一些代码来创建火花会话(总结):
SparkConf sparkConf = new SparkConf()
.setMaster("spark://localhost:7077")
.setAppName("test");
SparkSession session = SparkSession.builder()
.config(sparkConf)
.getOrCreate();
...
据我所知,我们运行上面的代码,为我创建应用程序 test 并从我的 spark 集群中分配一些资源。 (我在独立模式下使用 Spark)例如假设它使用了我所有的资源。 (所以没有额外的新应用资源)
现在我只有 一个 休息服务器,它根本无法扩展,如果它出现故障,用户将无法再使用休息服务器 API。所以我想将它扩展到不同机器和不同 JVM 上的两个实例(至少)。 (这是我的问题与其他问题不同的部分)
如果我使用与 上面 相同的代码带来另一个我的 rest 服务器实例,那么它将创建新的 Spark 会话(因为它在另一台机器上是不同的 JVM)并且它还会创建另一个 application在 Spark 中使用 test 名称。但是由于我说我的所有资源都已被第一个 Spark 会话使用,所以此应用程序处于 待机 状态,无法执行任何操作。 (直到资源免费)
关于问题的说明:
- 我不想拆分集群资源并添加一些到第一个休息服务器和一些到第二个休息服务器。
- 我希望两个版本(或任何其他数量的实例,如果我提到的话)都有一个 Spark
application。换句话说,我希望在 不同的 JVM 中使用相同的 SparkContext。另请注意,我在 Spark 中以 cluster 模式提交我的 spark 查询,因此我的应用程序不是工作程序,并且集群中的一个节点成为驱动程序。
要求
上面的描述很清楚,我希望我的rest server是active-active类型的HA,这样两个spark客户端都连接到同一个application,并且可以给出对rest server的请求给他们每个人。这是我更高层次的需求,可能是另一种满足的方式。
如果有类似的应用程序或特殊文档或经验,我将非常感激,因为我的搜索总是以我在开始时提出的问题结束,而它们与我的问题无关。由于我的英语不好,如果在某些地方有错别字,我感到很遗憾。谢谢。
【问题讨论】:
-
执行 SparkSQL 查询是否足够或需要提交用 DSL 编写的应用程序?
-
我最近有几乎相同的要求,经过多次反复,我们得出结论,在当前的 Spark 状态下根本不可能。一个 Spark 应用程序严格绑定到一个 JVM。您可以通过使该 JVM 成为转发所有其他请求的代理来“作弊”,但这仍然会导致单点故障和可伸缩性问题。
标签: java apache-spark apache-spark-sql