多服务器分布式安装中科院EasyML

*学长让我学习使用中科院EasyML平台的使用用于日后的工作,所以就想着用备用机部署一下EasyML(以下简称EML)。
*本地部署不是很难,根据EML官方的github可以布置。https://github.com/ICT-BDA/EasyML/blob/master/QuickStart.md
(推荐阅读)还有我之前写过的本地使用docker安装EML:https://blog.csdn.net/sugar_HIT/article/details/86573613 。

多虚拟机分布式安装中科院EasyML

看过官方文档(前面链接)的朋友可能注意到:
1、第一种用 IDE 本地运行的应该是有问题的,目前我还没有查找到解决方案。
2、第二种使用docker在本机上布置EML的,内存又有一点吃不消。
3、不用ubuntu可能会遇到权限问题

本文目的:
1、拆分一台机器上跑的四个docker到四台虚拟机上,降低一台机器上的运算压力;
2、实现EML中hadoop分布式配置

我们的主要目的是布置使用EML。至于在布置过程中遇到的 docker使用问题centos调整权限问题
等问题不是我们要学习的主要内容。所以需要分布式安装的朋友请参考我这里的软硬件参数。

需要的软硬件设备:
1、稳定的因特网连接;
2、虚拟机(服务器)资源4台,(最好)处于同一局域网。
※ 不推荐使用阿里云来操作

虚拟机编号 虚拟机IP地址 虚拟机名称 虚拟机操作系统 虚拟机配置
1 10.245.142.14 hadoop-master 不低于ubuntu16.04.5(需要能够正常运行docker) 内存不低于1GB,存储空间不小于10GB
2 10.245.142.20 hadoop-slave1 不低于 ubuntu16.04.5 内存不低于1GB,存储空间不小于10GB
3 10.245.142.21 hadoop-slave2 不低于ubuntu16.04.5 内存不低于1GB,存储空间不小于10GB
4 10.245.142.125 MySQL 不低于ubuntu 16.04.5 内存不低于1GB,存储空间不小于10GB

以下五条是开启服务器相应端口的网络出入规则。如果服务器不对网络端口出入规则进行限制,请跳过。

  • 需要开启上述四台机器的6783端口(TCP/UDP 出/入双向)的网络出入规则或者关闭防火墙。
  • 需要开启虚拟机1 hadoop-master的 8032 / 18080 / 19888 / 7077 / 50070 / 8088 / 9000 / 11000 / 50030 / 8050 / 8081 / 8900端口
  • 需要开启虚拟机2 hadoop-slave1的 8042 / 50010 / 50020 端口
  • 需要开启虚拟机3 hadoop-slave2的 8042 / 8043 / 50011 / 50021端口
  • 需要开启虚拟机4 MySQL的3306端口

※ 操作方法:https://blog.csdn.net/sugar_HIT/article/details/86664475

.
—————————————————————————————————————————————————
.

1、安装docker

虚拟机1 hadoop-master sudo apt-get install docker-ce
虚拟机2 hadoop-slave1 sudo apt-get install docker-ce
虚拟机3 hadoop-slave2 sudo apt-get install docker-ce
虚拟机4 MySQL sudo apt-get install docker-ce

2、启动docker

虚拟机1 hadoop-master service docker start
虚拟机2 hadoop-slave1 service docker start
虚拟机3 hadoop-slave2 service docker start
虚拟机4 MySQL service docker start

安装完之后请自行测试docker是否成功安装。测试方法:docker run hello-world
※ ubuntu下运行docker需要使用root用户sudo su

3、安装weave

(1) 安装weave

虚拟机1 hadoop-master

wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
chmod a+x /usr/local/bin/weave

虚拟机2 hadoop-slave1

wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
chmod a+x /usr/local/bin/weave

虚拟机3 hadoop-slave2

wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
chmod a+x /usr/local/bin/weave

虚拟机4 MySQL

wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
chmod a+x /usr/local/bin/weave

(2) 测试weave的运行

测试weave是否能够成功运行,我们可以使用weave launch来启动weave。
虚拟机1 hadoop-master weave launch
虚拟机2 hadoop-slave1 weave launch
虚拟机3 hadoop-slave2 weave launch
虚拟机4 MySQL weave launch
weave的启动实际上也是拉取、运行docker镜像。(实际上运行三个容器)

(3) 关闭weave服务
确定后续weave能够正常连接多服务器;现在我们需要手动关闭weave服务,等到有需要的时候再启用weave。
命令weave stop不能关闭weave的全部容器。可能会影响后续虚拟机服务器(ECS)之间的连接。
所以关闭weave,需要关闭它的所有容器。
多服务器分布式安装中科院EasyML_第1张图片
关闭所有weave容器(共三个)

docker rm -f weave
docker rm -f weavevolumes-2.5.1
docker rm -f weavedb

事实上,根据版本不同,weave容器的名称(最后一列)也不同。你可能需要根据实际情况修改rm指令中的容器名。当然,rm指令也接受根据container id来关闭容器。使用时不用完全输入container id,只需要输入前几位(能够与其他容器分隔开的位数)即可。
假如我想要关闭名称为weave这个容器,除了前面的方法,还可以docker rm -f 3docker rm -f 3f7

4、上传EML镜像

(1) 下载EML镜像

Google Drive:
https://drive.google.com/open?id=0B5Lj6qkCMBbFWW5uYlJwb2drb1k
或者使用百度云:
https://pan.baidu.com/s/1bpMwYSJ
把下载后的软件在本地压缩一下。比如压缩成 EML.zip

(2)上传EML镜像
向服务器上传EML镜像的方法有很多。这里只介绍一种。
(使用Xshell)
安装lrzsz
虚拟机1 hadoop-master apt-get install lrzsz
虚拟机2 hadoop-slave1 apt-get install lrzsz
虚拟机3 hadoop-slave2apt-get install lrzsz
虚拟机4 MySQL **无操作**

上传文件
虚拟机1 hadoop-master rz 然后 选择刚刚压缩好的 EML.zip 文件 耐心等待上传完成
虚拟机2 hadoop-slave1 rz 然后 选择刚刚压缩好的 EML.zip 文件 耐心等待上传完成
虚拟机3 hadoop-slave2 rz 然后 选择刚刚压缩好的 EML.zip 文件 耐心等待上传完成
虚拟机4 MySQL **无操作**
因为文件较大,可能会出现上传失败的情形。上传完成后,请使用命令 ls 确认文件成功上传。没有成功上传需要重传。
文件成功上传后,解压文件(可以至任何文件夹)
虚拟机1 hadoop-master unzip EML.ZIP
虚拟机2 hadoop-slave1 unzip EML.ZIP
虚拟机3 hadoop-slave2 unzip EML.ZIP
虚拟机4 MySQL **无操作**
解压完成后,如下
解压完成
5、加载EML镜像

进入4、(2)上传EML镜像步骤中解压后的镜像文件夹。 我的是Environment文件夹。
虚拟机1 hadoop-master cd Environment
虚拟机2 hadoop-slave1 cd Environment
虚拟机3 hadoop-slave2cd Environment
虚拟机4 MySQL **无操作**
然后挂载相应的镜像。需要执行相应的shell脚本
虚拟机1 hadoop-master sh build.sh
虚拟机2 hadoop-slave1 sh build.sh
虚拟机3 hadoop-slave2 sh build.sh
虚拟机4 MySQL **无操作**

6、运行weave
运行weave,使容器所在的宿主机间具有互联能力。
我们在刚才的准备工作中已经明确了各虚拟机的IP地址。

虚拟机编号 虚拟机名称 虚拟机IP
1 hadoop-master 10.245.142.14
2 hadoop-slave1 10.245.142.20
3 hadoop-slave2 10.245.142.21
4 MySQL 10.245.142.125

虚拟机1 hadoop-master weave launch
虚拟机2 hadoop-slave1 weave launch 10.245.142.14
虚拟机3 hadoop-slave2 weave launch 10.245.142.14
虚拟机4 MySQL weave launch 10.245.142.14
weave launch是启动weave服务。虚拟机2(hadoop-slave1)、虚拟机3(hadoop-slave2)、虚拟机4(MySQL)weave launch **IP1**是在启动的同时直接连接到虚拟机1(hadoop-master)上,等价于执行了weave launchweave connect **IP1**
完成上述步骤后,可以使用weave status查看weave连接情况。
多服务器分布式安装中科院EasyML_第2张图片
其中,Peers:4 (图内第10行)代表四台宿主机成功建立连接。

7、运行EML镜像

我们想要实现EML各容器穿透宿主机互访。首先在虚拟机上运行容器,再为其指定IP。
根据一开始的设计:
虚拟机1用于运行hadoop-master
虚拟机2用于运行hadoop-slave1
虚拟机3用于运行haddoop-slave2
虚拟机4用于运行MySQL

虚拟机1 hadoop-master:

docker run -itd --restart=always  \--privileged \-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 \--name hadoop-master \--hostname hadoop-master \--add-host mysql:172.18.0.2 \--add-host hadoop-slave1:172.18.0.4 \--add-host hadoop-slave2:172.18.0.5 \cluster /bin/bash

虚拟机2 hadoop-slave1:

docker run -itd --restart=always \--privileged \-p 8042:8042 \-p 50010:50010 \-p 50020:50020 \--name hadoop-slave1 \--hostname hadoop-slave1 \--add-host mysql:172.18.0.2 \--add-host hadoop-master:172.18.0.3 \--add-host hadoop-slave2:172.18.0.5 \cluster /bin/bash

虚拟机3 hadoop-slave2:

docker run -itd --restart=always \--privileged \-p 8042:8042 \-p 50010:50010 \-p 50020:50020 \--name hadoop-slave1 \--hostname hadoop-slave1 \--add-host mysql:172.18.0.2 \--add-host hadoop-master:172.18.0.3 \--add-host hadoop-slave2:172.18.0.5 \cluster /bin/bash

虚拟机4 MySQL:

docker run --name mysql --restart=always  --hostname mysql -p 3306:3306 -d nkxujun/mysql_eml:1.1.0

8、初试化数据库
虚拟机4 MySQL docker exec -it mysql mysql -uroot -p111111 -e "source /root/mysql/main.sql;"

9、为容器指定IP

容器所在宿主机 容器名 容器IP
1 hadoop-master 172.18.0.3
2 hadoop-slave1 172.18.0.4
3 hadoop-slave2 172.18.0.5
4 mysql 172.18.0.2

容器名、IP和第7步指令中的 --add-host对应。
接下来在各台机器上为容器指定IP以实现容器间的直接互访。

虚拟机1 hadoop-master weave attach 172.18.0.3/16 hadoop-master
虚拟机2 hadoop-slave1 weave attach 172.18.0.4/16 hadoop-slave1
虚拟机3 hadoop-slave2 weave attach 172.18.0.5/16 hadoop-slave2
虚拟机4 MySQL weave attach 172.18.0.2/16 mysql

10、启动每台机器的ssh服务
虚拟机1 hadoop-master docker exec -it hadoop-master /etc/init.d/ssh start
虚拟机2 hadoop-slave1 docker exec -it hadoop-slave1 /etc/init.d/ssh start
虚拟机3 hadoop-slave2 docker exec -it hadoop-slave2 /etc/init.d/ssh start
虚拟机4 MySQL **啥也不干,瞅着**
进入任何一台容器,测试是否能够直接与其他容器互通。
如进入hadoop-master容器,ping hadoop-slave1容器:
虚拟机1 hadoop-master root@ubuntu-server:/root/adminhit#docker exec -it hadoop-master /bin/bash
虚拟机1 hadoop-master root@hadoop-master:~#ping hadoop-slave1
正常情况下能够ping通。如果没有ping通,请确认weave status情况正常,端口6783配置正常。
请最起码确认hadoop-master可以ping通hadoop-slave1,hadoop-slave2和mysql三个容器。

11、各容器实现ssh免密码登录

第11步中部分操作参考了:
https://www.cnblogs.com/fuyuteng/p/9280552.html
https://blog.csdn.net/shgh_2004/article/details/80599515
的方法,经试验有效。十分感谢诸大神分享经验!

进行下属步骤:
(1)进入hadoop-master容器
(2)创建公钥(用于ssh免密登陆)
(3)修改ssh配置
(4)进入hadoop-slave1,修改ssh配置
(5)向hadoop-slave1容器加入hadoop-master公钥
(6)进入hadoop-slave2,修改ssh配置
(7)向hadoop-slave2容器加入hadoop-master公钥
hadoop-master、hadoop-slave1、hadoop-slave2三者需要实现互相免密ssh。方法类似,不赘述。仅列出hadoop-master与其他二者的免密ssh方式。
具体操作:
(1)虚拟机1 hadoop-master docker exec -it hadoop-master /bin/bash
(2)虚拟机1 hadoop-master cat /root/.ssh/id_rsa.pub 然后 **查看id_rsa.pub的内容,用鼠标选中,复制全部内容。**
(如果没有id_rsa.pub文件,请自行生成。具体步骤见https://www.cnblogs.com/fuyuteng/p/9280552.html 步骤6
(3)虚拟机1 hadoop-master vi /etc/ssh/sshd_config ;将(最后一行) UsePAM yes 修改为 UsePAM no
(4)虚拟机2 hadoop-slave1

docker exec -it hadoop-slave1 /bin/bash
vi suibianname.pub
粘贴入(2)中复制的公钥
cat suibianname.pub >> ~/.ssh/authorized_keys

(5)虚拟机2 hadoop-slave1 vi /etc/ssh/sshd_config ;将(最后一行) UsePAM yes 修改为 UsePAM no
(6)虚拟机3 hadoop-slave2

docker exec -it hadoop-slave2 /bin/bash
vi suibianname.pub
粘贴入(2)中复制的公钥
cat suibianname.pub >> ~/.ssh/authorized_keys

(7)虚拟机3 hadoop-slave2 vi /etc/ssh/sshd_config ;将(最后一行) UsePAM yes 修改为 UsePAM no
现在可以在hadoop-master 免密码ssh到hadoop-slave1和hadoop-slave2了。
测试:
虚拟机1 hadoop-master: root@hadoop-master:~# ssh hadoop-slave1 可以正常ssh至hadoop-slave1容器;
虚拟机1 hadoop-master: root@hadoop-master:~# exit 可以退出ssh连接hadoop-slave1容器,返回hadoop-master容器。

12、启动EML
步骤是:
(1)进入hadoop-master宿主机下hadoop-master容器;
(2)hadoop-master容器启动hadoop服务
(3)hadoop-master容器启动run-wordcount服务
(4)hadoop-master容器启动oozie服务
虚拟机1 hadoop-master:
(1)root@ubuntu-server:/home/adminhit# docker exec -it hadoop-master /bin/bash
(2)root@hadoop-master:~# sh start-hadoop.sh
(3)root@hadoop-master:~# sh run-wordcount.sh
(4)root@hadoop-master:~# sh start-oozie.sh

部署效果:

使用浏览器访问hadoop-master主机IP:18080/EMLStudio(注意url大小写)可以看到,可以成功访问并使用EML了。
浏览器访问 http://10.245.142.14:18080/EMLStudio
多服务器分布式安装中科院EasyML_第3张图片
登录界面:(初始登录账号是[email protected],密码是 bcdict。登录后可以新建账号、更改账号)
多服务器分布式安装中科院EasyML_第4张图片
最后是EML常用url

用途 url
EML机器学习Studio(机器学习图形化界面) http://hadoop-master:18080/EMLStudio
Hadoop集群管理 http://hadoop-master:50070

EastML是中国科学院研发的开源可视化的机器学习平台。
相关链接:https://github.com/ICT-BDA/EasyML/blob/master/QuickStart.md

参考:
DOCKER安装EasyML步骤
https://blog.csdn.net/sugar_HIT/article/details/86573613
DOCKER跨宿主机联络
https://www.cnblogs.com/kevingrace/p/6859173.html
DOCKER容器之间免SSH登录
https://www.cnblogs.com/fuyuteng/p/9280552.html
https://blog.csdn.net/shgh_2004/article/details/80599515
DOCKER的使用
http://www.runoob.com/docker/docker-command-manual.html
.
在此致以谢意。

你可能感兴趣的:(机器学习)