Skip to content

利用docker部署分布式EasyML集群

Hdsgdhr edited this page Nov 21, 2017 · 1 revision

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。使用虚拟化的docker容器搭建的集群的管理和控制部署都更加方便。Weave能够创建一个虚拟网络,用于连接部署在多台主机上的Docker容器,可以实现跨主机docker容器通信。使用docker和weave可以搭建分布式EML集群(目前不支持开发环境连接集群,可将项目打包部署至集群tomcat服务中)。

准备工作

我们在三台机器上部署分布式EML集群,均为64位CentOs7系统。三台机器如下:

 主机A:192.168.0.100 hadoop-master
 主机B:192.168.0.101 hadoop-slave1
 主机C:192.168.0.102 hadoop-slave2

在三台机器上分别执行以下操作:

下载安装docker

  • 按照official guide 在每台机器安装docker(要求版本在1.10.0及以上)。
  • 可以使用docker version命令查看是否成功安装docker。

下载mysql、ubuntu镜像,构建cluster镜像

  • 从dockerhub中获取mysql server和ubuntu_eml镜像。
 docker pull nkxujun/mysql_eml:version_number(默认为latest)    //导入mysql镜像  
 docker pull nkxujun/ubuntu_eml:version_number(默认为latest)   //导入ubuntu镜像
  • 进入 google drive disk 或者 Baidu Cloud下载EML依赖文件和配置文件(注意:下载的版本号应与上一步下载的镜像一致)。

  • 进入上一步下载的文件目录,使用sh build.sh命令构建cluster镜像。

cd /root/EML/Environment
sh build.sh
  • 可以使用docker images查看镜像是否导入构建成功。
docker images
docker_images

创建weave网络

下载安装weave

  • Weave能够创建一个虚拟网络,用于连接部署在多台主机上的Docker容器,这样容器就像被接入了同一个网络交换机,那些使用网络的应用程序不必去配置端口映射和链接等信息。在三台机器上分别执行以下命令下载安装weave。
 curl -L git.io/weave -o /usr/local/bin/weave
 chmod a+x /usr/local/bin/weave
  • 使用docker images命令,可以看到,weave下载了三个镜像,分别是weaveexec、weave、和weavedb,也可以使用weave version命令查看weave是否下载安装成功。
weave version
  • 使用brctl show命令可以看到两个网桥,分别是docker和weave生成的。
brctl show
docker_brctl

启动weave

  • 在三台主机上分别启动weave。
 weave launch                 //在主机A上启动weave
 weave launch 192.168.0.100      //在主机B上启动weave,并连接A
 weave launch 192.168.0.100      //在主机C上启动weave,并连接A
  • 使用weave status命令,可以看到,B、C已经通过weave与A成功建立连接。
 weave status
docker_weave status

启动容器

配置weave环境

在三台机器上分别配置weave环境。

 eval $(weave env)

创建容器

  • 在主机A上创建hadoop-master容器,创建启动并初始化mysql容器。weave的默认网段为10.32.0.0/12,我们在创建容器命令中为容器指定一个weave网段的ip地址。
 //创建mysql容器
 docker run -e WEAVE_CIDR=10.32.0.2/12 --name mysql --hostname mysql.weave.local -p 3306:3306 -d nkxujun/mysql_eml:version_number(默认为latest) 
 //进入EML所在目录,运行脚本初始化mysql 
 sh init_mysql.sh
 //创建hadoop-master容器  
 docker run -itd -e WEAVE_CIDR=10.32.0.3/12 --name=hadoop-master --hostname hadoop-master.weave.local -p 8032:8032 -p 18080:18080 -p 19888:19888 -p 7077:7077 -p 50070:50070 -p 8088:8088 -p 9000:9000 -p 11000:11000 -p 50030:50030 -p 8050:8050 -p 8081:8081 -p 8900:8900 --add-host mysql.weave.local:10.32.0.2 --add-host hadoop-master.weave.local:10.32.0.3 --add-host hadoop-slave1.weave.local:10.32.0.4 --add-host hadoop-slave2.weave.local:10.32.0.5 \cluster /bin/bash  
  • 在主机B上创建并启动hadoop-slave1容器。
 docker run -itd -e WEAVE_CIDR=10.32.0.4/12 --name=hadoop-slave1 --hostname hadoop-slave1.weave.local -p 8042:8042 -p 50010:50010 -p 50020:50020 --add-host mysql.weave.local:10.32.0.2 --add-host hadoop-master.weave.local:10.32.0.3 --add-host hadoop-slave1.weave.local:10.32.0.4 --add-host hadoop-slave2.weave.local:10.32.0.5 \cluster /bin/bash
  • 在主机C上创建并启动hadoop-slave2容器。
 docker run -itd -e WEAVE_CIDR=10.32.0.5/12 --name=hadoop-slave2 --hostname hadoop-slave2.weave.local -p 8043:8042 -p 50011:50011 -p 50021:50021 --add-host mysql.weave.local:10.32.0.2 --add-host hadoop-master.weave.local:10.32.0.3 --add-host hadoop-slave1.weave.local:10.32.0.4 --add-host hadoop-slave2.weave.local:10.32.0.5 \cluster /bin/bash

可以使用docker ps 命令查看容器是否创建启动成功。下图是主机A中的容器。

 docker ps
docker_containers of master

测试容器间是否能通信

  • 使用docker exec -it hadoop-master /bin/bash命令进入容器,使用ifconfig命令查看容器网络配置。可以看到,除docker网卡外,weave在容器中添加了一个虚拟网卡来搭建网络,跨主机容器容器可通过该网通信。
 docker exec -it hadoop-master /bin/bash   //进入容器
 ifconfig                                  //查看容器网络配置
docker_ifconfig
  • 从hadoop-master容器内ping hadoop-slave1,0 packet loss,说明网络是联通的,weave配置正确,可以在此基础上启动各项服务。
 ping hadoop-slave1
docker_ping

配置物理机hosts文件和容器间ssh免密访问

配置浏览器所在物理机hosts文件

  • 将hadoop各节点和mysql的IP地址添加至浏览器所在的物理机hosts文件中,例如:
 192.168.0.100 hadoop-master
 192.168.0.100 mysql
 192.168.0.101 hadoop-slave1
 192.168.0.102 hadoop-slave2

配置容器间ssh免密访问

在hadoop三个节点容器间两两配置ssh免密访问,保证每个容器能ssh免密登录至另外两个容器。

启动cluster中各项服务

启动hadoop和spark服务

  • 进入hadoop-master容器,运行start-hadoop.sh脚本,启动hadoop和spark服务。
 docker exec -it hadoop-master /bin/bash   //进入容器
 sh start-hadoop.sh                        //运行脚本
docker_start-hadoop
  • 在浏览器访问http://hadoop-master:50070(Hadoop主页),该端口号为hadoop namenode的端口。 进入网页之后选择Datanodes Tab,查看网页的Datanodes是否正常
docker_hadoopnodes
  • 在hadoop-master容器根目录下执行run-wordcount.sh进行hdfs文件上传测试,在hadoop主页上,进入Utility->Browers File System中,若能看到/user/root/input下有文件,则成功。

启动oozie和tomcat服务

  • 进入hadoop-master容器,运行start-oozie.sh脚本,启动oozie和tomcat服务。
 docker exec -it hadoop-master /bin/bash   //进入容器
 sh start-oozie.sh                         //运行脚本
docker_start-oozie
  • 在浏览器中打开http://hadoop-master:11000/oozie/ 进入Ooize Web Console页面。

  • 在Oozie Web Console的workflow jobs中查看是否有名字为shell-wf的任务,且该任务的状态为SUCCESS,若是则表示Oozie启动成功。

docker_oozie

访问EMLStudio并运行任务

  • 使用Chrome浏览器(非Chrome浏览器打开页面可能会导致部分功能显示不正常)打开http://hadoop-master:18080/EMLStudio/ 看是否能访问Easy Machine Learning主页。

  • 默认登入账号:[email protected];密码:bdaict

  • 登入EML系统后,点击左侧侧边栏的Job->examples,点击上面的任务进行显示。

  • 点击绘图区下方的Clone按钮,再点击Submit按钮提交job,若job运行成功(全部节点显示绿色)则表示系统搭建成功。

docker_job