假设我有一个看起来像这样的docker堆栈:

version: '3.3'
services:
  spark-master:
    image: gettyimages/spark
    networks:
      - sparknet
    environment:
      MASTER: spark://spark-master:7077
      SPARK_CONF_DIR: /conf
    ports:
      - target: 4040
        published: 4040
        protocol: tcp
        mode: host
      - target: 6066
        published: 6066
        protocol: tcp
        mode: host
      - target: 7077
        published: 7077
        protocol: tcp
        mode: host
      - target: 8080
        published: 8080
        protocol: tcp
        mode: host
    volumes:
      - spark-master-conf:/conf
      - spark-data:/tmp/data
    deploy:
      placement:
        constraints:
          - node.labels.sparkrole == master
    command: bin/spark-class org.apache.spark.deploy.master.Master


  spark-worker:
    image: gettyimages/spark
    networks:
      - sparknet
    depends_on:
      - spark-master
    environment:
      SPARK_CONF_DIR: /conf
      SPARK_WORKER_CORES: 2
      SPARK_WORKER_MEMORY: 2g
      SPARK_WORKER_PORT: 8881
      SPARK_WORKER_WEBUI_PORT: 8080
      SPARK_MASTER_URL: spark://spark-master:7077
    volumes:
      - spark-worker-conf:/conf
      - spark-data:/tmp/data
    command: bin/spark-class org.apache.spark.deploy.worker.Worker spark://spark-master:7077

networks:
  sparknet:

我测试了这个,它在这个配置中工作正常 . 我可以轻松地使用 docker service scale 来扩大和减少 Worker 的数量,我可以提交工作,这一切都在游泳 .

现在我已经把注意力转向了可用性,我正在阅读有关standby masters coordinated with zookeeper的内容,而且看起来很简单,但我唯一担心的是文档的以下部分:

为了安排新应用程序或将Worker添加到群集,他们需要知道当前领导者的IP地址 . 这可以通过简单地传入您曾经传入的Masters列表来完成 . 例如,您可以启动指向spark:// host1:port1,host2:port2的SparkContext . 这将导致您的SparkContext尝试向两个Masters注册 - 如果host1关闭,这个配置仍然是正确的,因为我们找到了新的领导者host2 .

只需使用内置的服务发现docker提供就足够了吗?如果我将spark-master扩展到3个副本,并且我用“spark:// spark-master:7077”初始化SparkContext,它会解析为正确的领导节点吗?

相关问题:

  • 如果SparkContext尝试向 spark://spark-master:7077 注册并且由于它被路由到不是当前领导者的复制主节点而失败,它会重试吗?

我想我可以通过在我的docker-compose文件中复制spark-master(IE Spark-master spark-master-standy1等等)以及在我的应用程序中使用 spark://spark-master:7077,spark-master-standby1:7077... 初始化SparkContext来解决这个问题 . 因为不可能轻易地缩放spark-master,但这不会是世界末日 .

总结一下我的实际问题:

  • Will docker overlay service discovery work properly for standby spark masters

  • How does SparkContext handle registering with the leader master? Will it retry on failure? Is this tuneable?