使用docker stack建構跨主機PySpark+Jupyter集群
发布日期:2021-05-06 19:48:58 浏览次数:20 分类:技术文章

本文共 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:

兩者的主要差異在於:

  1. services下多了visualizer
  2. 多了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。

其它細節詳見:,,,,。

踩坑記錄

參考連結

上一篇:在CentOS下新增ftp帳戶並限制其可訪問目錄
下一篇:如何在30秒內建構Spark環境--使用docker-compose 踩坑實錄

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年03月12日 00时27分13秒