跨不同 JVM 的相同 SparkContext

Ali*_*ady 5 java apache-spark apache-spark-sql

我有一个与 Apache Spark 相关的问题。我使用 Java 语言编写客户端代码,但我的问题可以用任何语言回答。

问题的标题看起来好像谷歌中已经有一个通用问题,可以通过简单的搜索找到,但问题是我的问题是别的问题,不幸的是每次我搜索时,我都没有找到与此相关的内容主题和我的要求。通常通过搜索找到但不是我的问题的类似主题是:

  1. 一个 SparkContext 多个 SparkSession
  2. 单个 JVM 中的多个 SparkSession
  3. ...

我的问题根本不是上面的问题,尽管看起来很相似。我首先解释一下我的问题。下面,在陈述问题之后,我会在更高层次上说出我的要求,因此我提出了这个问题。我的目标是,如果问题得到解答或提供了该需求的其他解决方案,该需求就会得到解决。

我试图解决的问题

我编写了一个休息服务器组件,其中使用了 Spark Java 库。这个rest服务器可以接收一系列特定格式的请求,然后根据请求形成查询,并通过Spark库函数将作业提交到Spark集群。(我自己的集群)还以异步响应的形式返回查询答案(当它准备好并且用户请求它时)。

我使用类似这样的代码来创建 Spark 会话(摘要):

SparkConf sparkConf = new SparkConf()
    .setMaster("spark://localhost:7077")
    .setAppName("test");
SparkSession session = SparkSession.builder()
    .config(sparkConf)
    .getOrCreate();
...
Run Code Online (Sandbox Code Playgroud)

据我所知,我们运行上面的代码,sparktest为我创建应用程序并从我的spark集群分配一些资源。(我在独立模式下使用 Spark)例如假设它使用我的所有资源。(所以没有资源用于额外的新应用)

现在我只有一台休息服务器,它根本无法扩展,如果它出现故障,用户将无法再使用休息服务器 API。所以我想将其扩展到(至少)不同机器和不同 JVM 上的两个实例。(这是我的问题与其他问题不同的部分

如果我使用与上面相同的代码引入其余服务器的另一个实例,那么它将创建新的 Spark 会话(因为它在另一台机器上是不同的 JVM),并且还会创建另一个在 Spark 中application具有名称的会话。test但由于我说过我的所有资源都已被第一个 Spark 会话使用,因此该应用程序处于待机状态,无能为力。(直到资源免费)

关于问题的注释:

  1. 我不想拆分集群资源并将一些资源添加到第一个休息服务器,并将一些资源添加到第二个休息服务器。
  2. 我希望两个版本(或者我提到的任何其他数量的实例)都有一个 Spark application。换句话说,我想要跨不同 JVM 的相同 SparkContext。另请注意,我在 Spark 中以集群模式提交 Spark 查询,因此我的应用程序不是工作线程,集群中的节点之一成为驱动程序。

要求

从上面的描述中可以清楚地看出,我希望我的其余服务器是主动-主动类型的 HA,以便两个 Spark 客户端都连接到同一个application,并且可以将对其余服务器的请求发送给它们中的每一个。这是我更高层次的需求,也许是另一种方式来满足。

如果有类似的应用程序或特殊的文档或经验,我将非常感激,因为我的搜索总是以我在开始时显示的问题结束,而它们与我的问题无关。由于我的英语水平较差,如果某些部分有错别字,我感到很遗憾。谢谢。

jgp*_*jgp 2

我非常喜欢你的想法(可能是因为我过去必须实现很多类似的事情)。

简而言之,我 95% 确信没有办法在机器之间共享 JVM、SparkContext、执行等。我尝试在 SparkContext 之间共享数据帧,但这是一个巨大的失败;)。

我的处理方式是:

  • 如果您的 REST 服务器连接到集群,一旦 Spark 会话可用,请将服务器注册到负载均衡器。

  • 如果您将 REST 服务器作为 Spark 作业提交,则可以将其注册到负载均衡器。

您可以提交多个作业/启动多个服务器。他们可以选择任何广告端口,并与负载均衡器共享。

您的 REST 客户端将与负载均衡器交互,而不是直接与 Spark REST 服务器交互。您的 REST 服务器必须具有运行状况检查端点,以便负载均衡器可以完成其工作。

如果您的一台 REST 服务器出现故障,负载均衡器可以启动一台新服务器。您将丢失应用程序的数据帧,但不会丢失多个应用程序。

如果多个 REST 服务器需要交换数据,我会使用 Delta 作为“缓存”或暂存区域。

那有意义吗?实施并提供良好的 HA 应该不会太难。