
本文共 5660 字,大约阅读时间需要 18 分钟。
使用docker stack建構跨主機PySpark+Jupyter集群
前言
在前篇中介紹了使用docker-compose
在一台機器架設PySpark+Jupyter環境的方法。
在本篇中,會延續前篇,將原本單機版的環境擴展到多主機的集群,並且加入visualizer,讓我們可以在網頁中監控docker集群。
使用步驟
1. 下載這個項目
git clone -b all_merged https://github.com/keineahnung2345/docker-blog-example.git
2. 建立docker swarm
docker swarm init --advertise-addr=
3. 啟動docker集群
使用的指令由:
docker-compose up
變為:
docker stack deploy -c <(docker-compose config) dbe
注:這裡使用docker stack deploy dbe
會出現環境變量無法載入的問題,詳見。
項目中有兩個yml檔案,除了預設的docker-compose.yml
外還有docker-compose-visualizer.yml
這個檔案。
docker-compose-visualizer.yml
中加入visualizer(來自)。 如此一來就可以在瀏覽器中監控docker集群的運行情況。 我們可以用以下指令啟動帶有visualizer的docker集群:
docker stack deploy -c <(docker-compose -f docker-compose-visualizer.yml config) dbe
4. 在命令行中監控docker集群
以下是幾個常用的指令:
docker stack ls
docker stack services dbe
docker stack ps dbe
docker service
詳見:
5. 在瀏覽器中監控docker集群
前往http://<your-host-ip>:8089
與原版的差異
本篇與前篇的差異不僅在於將單機擴展到多機,還加入了visualizer。
這讓我們可以在網頁中監控docker的運行情況。讓我們來看一下兩者的差異:
原來的docker-compose.yml
version: "3.1"services: jupyter-debian: image: keineahnung2345/edgarperezsampedro-blog_docker:20181126 ports: - "8888:8888" links: - spark-master volumes: - ./notebooks:/notebooks - ./results:/results depends_on: - spark-master - spark-worker-1 env_file: .env environment: PASSWORD: ${ PASSWORD} spark-master: image: edgarperezsampedro/spark2-ubuntu command: bin/spark-class org.apache.spark.deploy.master.Master -h spark-master hostname: spark-master environment: MASTER: spark://spark-master:7077 SPARK_CONF_DIR: /conf SPARK_PUBLIC_DNS: ${ HOSTIP} expose: - 7001 - 7002 - 7003 - 7004 - 7005 - 7006 - 7077 - 6066 ports: - 4040:4040 - 6066:6066 - 7077:7077 - 8080:8080 spark-worker-1: image: edgarperezsampedro/spark2-ubuntu command: bin/spark-class org.apache.spark.deploy.worker.Worker spark://spark-master:7077 hostname: spark-worker-1 env_file: .env environment: SPARK_CONF_DIR: /conf SPARK_PUBLIC_DNS: ${ HOSTIP} SPARK_WORKER_CORES: 2 SPARK_WORKER_MEMORY: 2g SPARK_WORKER_PORT: 8881 SPARK_WORKER_WEBUI_PORT: 8081 links: - spark-master expose: - 7012 - 7013 - 7014 - 7015 - 7016 - 8881 ports: - 8081:8081
修改過後的docker-compose-visualizer.yml
version: "3.1"services: jupyter-debian: image: keineahnung2345/edgarperezsampedro-blog_docker:20181126 ports: - "8888:8888" links: - spark-master volumes: - ./notebooks:/notebooks - ./results:/results depends_on: - spark-master - spark-worker-1 env_file: .env environment: PASSWORD: ${ PASSWORD} networks: - webnet spark-master: image: edgarperezsampedro/spark2-ubuntu command: bin/spark-class org.apache.spark.deploy.master.Master -h spark-master hostname: spark-master environment: MASTER: spark://spark-master:7077 SPARK_CONF_DIR: /conf SPARK_PUBLIC_DNS: ${ HOSTIP} expose: - 7001 - 7002 - 7003 - 7004 - 7005 - 7006 - 7077 - 6066 ports: - 4040:4040 - 6066:6066 - 7077:7077 - 8080:8080 networks: - webnet spark-worker-1: image: edgarperezsampedro/spark2-ubuntu command: bin/spark-class org.apache.spark.deploy.worker.Worker spark://spark-master:7077 hostname: spark-worker-1 env_file: .env environment: SPARK_CONF_DIR: /conf SPARK_PUBLIC_DNS: ${ HOSTIP} SPARK_WORKER_CORES: 2 SPARK_WORKER_MEMORY: 2g SPARK_WORKER_PORT: 8881 SPARK_WORKER_WEBUI_PORT: 8081 links: - spark-master expose: - 7012 - 7013 - 7014 - 7015 - 7016 - 8881 ports: - 8081:8081 networks: - webnet visualizer: image: dockersamples/visualizer:stable ports: - "8089:8080" volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: placement: constraints: [node.role == manager] networks: - webnetnetworks: webnet:
兩者的主要差異在於:
- services下多了visualizer
- 多了networks這個欄位
visualizer
ports
visualizer的ports欄位下的"8089:8080"
表示把container內部的8080 port對應到host上的8089 port。
volumes
而volumes則是將container外的/var/run/docker/sock
目錄對應到container內部。如此一來,container便可以監控其它container的運行情況。
deploy
注意到visualizer的deploy下有個限制:
deploy: placement: constraints: [node.role == manager]
這個意思是說,限制visualizer這個service只能運行在docker swarm的manager(與之相對應的是worker)上。而docker swarm manager與worker的差別可以參考:。
networks
在布署compose application到swarm集群時,可以使用自帶的overlay driver來讓分布在多機上的container可以互相溝通。
以下譯自:
overlay network driver創造了橫跨多個docker daemon主機的分布式網路。這個網路位於各主機網路之上,這讓容器可以安全地互相溝通。docker並且負責正確地將docker daemon主機上的packet送到其目標容器。
我們可以使用docker network ls
來查看現有的docker network,以下為在筆者機器上執行的結果:
NETWORK ID NAME DRIVER SCOPEf954a9bc31d9 bridge bridge localuejs7xuxdol9 dbe_webnet overlay swarm890fbc8442bd dcos bridge locale47de27aca0b docker_gwbridge bridge local491f90195245 host host localv39dda60jg2n ingress overlay swarm318f113b0f68 none null local
其中dbe_webnet就是我們在docker-compose-visualizer.yml中定義的docker network,我們可以看到它使用的driver是overlay。
其它細節詳見:,,,,。
踩坑記錄
參考連結
发表评论
最新留言
关于作者
