具有主服务发现功能的 Spark Standalone 模式

Spark Standalone mode with master service discovery

我们有一个独立的 spark,它有 2 个 master。我们正在使用 consul 来发现我们所有的服务。这样就不用写在工作配置中,例如: spark://172.40.101.1:7077,172.40.102.2:7077

我们就写

spark://spark-master.service:7077

问题是,如果例如 172.40.101.1 处于待机状态,而 172.40.102.2 处于活动状态,并且在第一次工作人员将获得 101.1,那么它将不会再次尝试。好像它是静态的。

现在我可以使用挖掘和 linux 解析,但我的问题是:

  1. worker 配置是静态的吗?
  2. 这个问题有最佳实践吗?

这个问题有两个部分。首先是如何识别活动(或备用)火花?第二个问题是如何使用该信息连接到正确的信息?

如果您可以通过网络 url 获取或进程操作来判断哪些是活动的,哪些是备用的,您可以基于此创建服务/健康检查。谷歌搜索了一下,我看到了 spark consul 服务,它在这里进行健康检查:

{
"service": {
  "name": "spark-master",
  "port": 7077,
  "checks": [
    {
      "script": "ps aux | grep -v grep | grep org.apache.spark.deploy.master.Master",
      "interval": "10s"
    }
  ]
}
}

此运行状况检查通过脚本找到 java 进程。如果找到该进程,则健康检查成功。这个特定的健康检查不关心它是活动的还是备用的,要么匹配。您需要在具有不同名称的服务下进行健康检查,以确定 spark 节点是否处于活动状态。我对 spark 一无所知,但在网上查找我发现了这个 spark-submit 命令。如果这个命令像我想象的那样工作,这可能会成功:

{
    "service": {
      "name":"spark-active"
      ,"port":7077
      ,"checks":[{"script": "curl --silent  http://127.0.0.1:8080/ | grep '<li><strong>Status:</strong> ALIVE</li>'| wc -l | awk '{exit ($0 - 1) }'"
    }
}

然后您将使用以下方式连接:

spark://spark-active.service:7077

您的健康检查也可以通过http连接。 Consul 服务检查记录在此处:https://www.consul.io/docs/agent/checks.html

-g