使用docker stack建構跨主機PySpark+Jupyter集群

18 篇文章 0 订阅
9 篇文章 0 订阅

前言

在前篇如何在30秒內建構Spark環境–使用docker-compose 踩坑實錄中介紹了使用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=<your-host-ip>

3. 啟動docker集群

使用的指令由:

docker-compose up

變為:

docker stack deploy -c <(docker-compose config) dbe

注:這裡使用docker stack deploy dbe會出現環境變量無法載入的問題,詳見docker stack deploy無法載入.env檔案裡的環境變量及其解決方式

項目中有兩個yml檔案,除了預設的docker-compose.yml外還有docker-compose-visualizer.yml這個檔案。
docker-compose-visualizer.yml中加入visualizer(來自Docker Tutorial–Get Started, Part 5: Stacks)。
如此一來就可以在瀏覽器中監控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 

詳見: keineahnung2345/docker-tutorial

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:
        - webnet

networks:
  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的差別可以參考:How nodes work

networks

在布署compose application到swarm集群時,可以使用自帶的overlay driver來讓分布在多機上的container可以互相溝通。

以下譯自Use overlay networks

overlay network driver創造了橫跨多個docker daemon主機的分布式網路。這個網路位於各主機網路之上,這讓容器可以安全地互相溝通。docker並且負責正確地將docker daemon主機上的packet送到其目標容器。

我們可以使用docker network ls來查看現有的docker network,以下為在筆者機器上執行的結果:

NETWORK ID          NAME                DRIVER              SCOPE
f954a9bc31d9        bridge              bridge              local
uejs7xuxdol9        dbe_webnet          overlay             swarm
890fbc8442bd        dcos                bridge              local
e47de27aca0b        docker_gwbridge     bridge              local
491f90195245        host                host                local
v39dda60jg2n        ingress             overlay             swarm
318f113b0f68        none                null                local

其中dbe_webnet就是我們在docker-compose-visualizer.yml中定義的docker network,我們可以看到它使用的driver是overlay。

其它細節詳見:Networking in ComposeTop-level networks keyService-level networks keyUse overlay networksUNDERSTANDING DOCKER NETWORKING DRIVERS AND THEIR USE CASES

踩坑記錄

docker stack deploy無法載入.env檔案裡的環境變量及其解決方式

參考連結

如何在30秒內建構Spark環境–使用docker-compose 踩坑實錄
Docker Tutorial–Get Started, Part 5: Stacks
keineahnung2345/docker-tutorial
docker stack deploy無法載入.env檔案裡的環境變量及其解決方式
How nodes work
Networking in Compose
Top-level networks key
Service-level networks key
Use overlay networks
UNDERSTANDING DOCKER NETWORKING DRIVERS AND THEIR USE CASES
Your first docker-compose.yml file

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值