假设我有一个看起来像这样的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
扩大和缩小工人数量,我可以提交工作,这一切都可以顺利进行。
现在我已经把注意力转向了可用性,我正在阅读有关standby masters coordinated with zookeeper的内容,这看起来很简单,但我唯一担心的是文档的以下部分:
为了安排新应用程序或将Worker添加到群集, 他们需要知道当前领导者的IP地址。这可以 通过简单地传递您曾经使用过的Masters列表来完成 传递一个。例如,您可以启动SparkContext 指向spark:// host1:port1,host2:port2。这会导致你的 SparkContext尝试注册两个主人 - 如果host1去 下来,这个配置仍然是正确的,因为我们找到了新的 领导者,主持人。
只需使用内置的服务发现docker提供就足够了吗?如果我将spark-master扩展到3个副本,并且我用“spark:// spark-master:7077”初始化SparkContext,它会解析为正确的领导节点吗?
相关问题:
spark://spark-master:7077
注册,但由于它被路由到不是当前领导者的复制主节点而失败,它会重试吗?我想我可以通过在我的docker-compose文件中复制spark-master(IE Spark-master + spark-master-standy1 ...等)并在我的应用程序中初始化SparkContext来以一种黑客方式解决这个问题使用spark://spark-master:7077,spark-master-standby1:7077...
,但这很容易缩放spark-master docker service scale
,但这不会是世界末日。
总结我的实际问题: