假设我有一个看起来像这样的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?