Skip to content

Docker Toolbox 搭建EasyML 集群

Xinjie Chen edited this page Dec 12, 2017 · 8 revisions

本文以windows系统为例,介绍如何使用docker toolbox搭建EasyML集群。其搭建流程也适用于Mac系统。

(1)安装windows版本docker

安装参考链接:http://blog.csdn.net/tina_ttl/article/details/51372604

  • 从官网上下载 DockerToolBox.exe,根据链接中的安装说明进行toolbox.exe安装
  • 需要选择一台CPU支持VT-X/AMD-v功能的电脑,并启用该功能。如何验证及启用:进入BIOS,查看是否有Virtualization Technology,设置其为Enable启用该功能。
  • 打开Oracle VM VirtualBox,在default的虚拟机上,调整内存大小为4g以上 ,保存该虚拟机(Docker默认安装在名字为default的虚拟机上)
  • 建议系统内存大小至少8G及以上,硬盘容量至少10G及以上,否则会出现容器无法启动或电脑卡死的问题

注:关于版本(执行步骤一致,仅容器个数不一致)

a、简化版Docker安装(仅保留hadoop-master,目前该版本仅支持1.0.0):下载链接

b、分布式版Docker安装(1个hadoop-master,2个hadoop-slave,可下载最新版本):下载链接

(2)安装mysql数据库镜像

  • 点击Docker Quickstart Terminal.exe,从CMD Line中进入安装主文件夹(指网盘上下载的EML安装包解压之后的目录,/EML/Environment/)目录

a、在线安装

  • 从docker hub 上拉取镜像
 docker pull nkxujun/mysql_eml:version_number(默认为latest)
 docker images //查看是否下载成功

b、离线安装(百度网盘已提供该文件)

  • 导入镜像文件:mysql_eml.tar
 docker load --input mysql_eml.tar
 docker images //查看是否导入成功

(3)安装ubuntu镜像

  • 点击Docker Quickstart Terminal.exe,进入安装主文件夹目录

a、在线安装

  • 从docker hub 上拉取镜像
 docker pull nkxujun/ubuntu_eml:version_number(默认为latest)
 docker images //查看是否下载成功

b、离线安装(百度网盘已提供该文件)

  • 导入镜像文件:ubuntu_eml.tar
 docker load --input ubuntu_eml.tar
 docker images //查看是否导入成功

(4)执行build.sh脚本

该脚本用于下载及安装一些软件、配置目录,生成镜像。所有的安装软件安装在容器中的/usr/local/目录下。

  • 在安装文件夹主目录,执行sh build.sh ,建立集群镜像(执行过程中共有50多个步骤,需确保每个步骤都成功才算成功)
  • 执行完后可通过docker images查看到名字为cluster的image

可能出现的问题:

  • 执行build.sh脚本时出现no space left on device.(默认virtualbox虚拟机disk不够大,需要对其进行调整)
 修改virtualbox中default虚拟机的内存大小

(5)创建Docker虚拟网桥

Window docker在自动分配容器地址时会出现地址重叠问题,因此为了保险起见,配置静态ip,防止容器地址跳动。该网桥只能创建一次。

  • 执行build_network.sh脚本,创建名称为 shadownet的网桥,静态IP域为172.18.0.0/16 docker 默认的网桥为docker0,域为172.17.0.1开始的ip,根据容器创建的先后顺序自动分配ip
 sh build_network.sh  //在安装文件目录执行该脚本

(6)执行run_container脚本

该脚本用于启动容器并进行端口映射。

  • 在安装主目录中执行run_container.sh脚本,通过docker ps查看mysqlhadoop-masterhadoop-slave1hadoop-slave2容器是否启动

  • 进入hadoop-master容器 docker exec -it hadoop-master /bin/bash 检查master、slave1、slave2容器是否启动了ssh server(具体方法参照下方可能出现的问题的步骤执行)。以hadoop-master容器为例:检查如下命令,是否成功跳转

 ssh localhost
 exit  //每次跳转都需要退出
 ssh hadoop-slave1
 exit
 ssh hadoop-slave2
 exit

可能出现的问题:

  • 若出现ssh connection refused.(ssh 连接失败,ssh server未启动)
//通过Docker Quickstart Terminal分别进入hadoop-master,hadoop-slave1,hadoop-slave2容器
docker exec -it container_name /bin/bash   //进入某个容器命令

//执行如下命令启动ssh server
/etc/init.d/ssh start  //启动ssh

(7)导入数据库到mysql容器

该脚本用于初始化数据库

  • 在安装目录下执行 sh init_mysql.sh.

  • 进入mysql容器,登入mysql,查看oozie数据库及studio数据库是否存在

docker exec -it mysql /bin/bash;  //进入mysql容器
mysql -uroot -p111111  //登入mysql 
show databases;   //查看mysql中的表

可能出现的问题:

  • 若需要更新mysql数据库,可通过将mysql脚本包拷贝到mysql容器中
docker cp mysql mysql:/root/  //其中mysql:中的mysql为mysql容器名

执行mysql容器/root/mysql目录中的main.sql文件导入数据

mysql -uroot -p111111  //登入mysql
source /root/mysql/main.sql  //在mysql数据库中执行main.sql脚本

当然也可以通过navicate连接mysql数据库执行更新之后的脚本

(8)运行start-hadoop.sh脚本

该脚本用于启动hadoop集群和Spark集群

  • 进入hadoop-master容器根目录, 执行start-hadoop.sh脚本
docker exec -it hadoop-master /bin/bash //进入hadoop-master容器根目录
sh start-hadoop.sh  //执行start-hadoop脚本
  • 在Windows系统下访问192.168.99.100:50070Hadoop主页),该IP地址为windows docker安装的默认ip,端口号为hadoop namenode的端口。 进入网页之后选择Datanodes Tab,查看网页的Datanodes是否正常

  • 在hadoop-master容器根目录下执行run-wordcount.sh进行hdfs文件上传测试,在hadoop主页上,进入Utility->Browers File System中能看到/user/root/input下有文件,则成功

可能出现的问题:

  • 运行脚本start-hadoop.sh. 若hadoop集群中途出错,则需要先关闭所有的hadoop任务,即通过以下命令
$HADOOP_HOME/sbin/stop-dfs.sh 
$HADOOP_HOME/sbin/stop-yarn.sh 

(9)运行start-oozie.sh脚本

该脚本用于启动oozie和tomcat

  • 进入hadoop-master容器根目录,执行start-oozie.sh脚本

  • 执行上述脚本成功后,通过查看oozie status命令,看oozie是否成功

oozie admin -oozie http://hadoop-master:11000/oozie -status 
System mode:NORMAL //显示正常结果,oozie状态正常
  • 在Windows系统浏览器中打开http://192.168.99.100:11000/oozie/ 进入Ooize Web Console

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

  • 在Windows系统浏览器中打开http://192.168.99.100:18080Tomcat主页),若显示成功则表示tomcat启动成功

可能出现的问题:

  • start-oozie.sh脚本执行过程中可能会出现WARN hdfs.DFSClient:Caught exception,java.lang.InterruptedException
若按照上述步骤验证oozie是否启动及job是否成功执行,若二者均没问题,则该错误可忽略 //可能是由于docker容器内存不足导致访问hdfs速度变慢原因造成
//重新启动Oozie
$OOZIE_HOME/logs  //清空该目录
$OOZIE_HOME/oozie-server/logs //清空该目录
$OOZIE_HOME/oozie-server/temp  //清空该目录
$OOZIE_HOME/oozie-server/webapps //删除oozie和oozie.war
sh start-oozie.sh //重新执行启动脚本

(10)配置Windows host

  • 修改windows host. 具体目录为C:\Windows\System32\drivers\etc,添加如下内容
//其中IP地址为windows 给docker 虚拟机的默认IP
192.168.99.100  mysql  
192.168.99.100  hadoop-master 

(11)访问EML系统主页

  • 在Windows系统中用Chrome浏览器(非Chrome浏览器打开页面可能会导致部分功能显示不正常)打开http://hadoop-master:18080/EMLStudio/ 看是否能访问Easy Machine Learning主页
  • 默认登入账号:bdaict@hotmail.com;密码:bdaict

(12)执行系统job

  • 登入EML系统后,点击左侧侧边栏的Job->examples,点击上面的任务进行显示
  • 点击绘图区下方的Clone按钮,再点击Submit按钮提交job,若job运行成功(全部节点显示绿色)则表示系统搭建成功

可能出现的问题:

  • 登入失败

通过docker ps检查mysql容器是否被关闭,若机器内存不足,可能会存在部分容器被关闭的情况。

  • 登入失败,后台Tomcat出现java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal

关于上述登录失败问题,是由于工程所依赖的xml-api.jar包的版本问题造成的。在maven依赖中,oozie client和dom4j都包含了xml-api的不同版本的包。上述错误是因为由于包冲突,默认采用了xml-apis1.0.b2 这个包,这个包版本太低会出现上述错误。 xml_version

目前我们已经在pom中exclude dom4j的低版本的包,并进行重新打包,更新至网盘。您可以在 google drive disk or Baidu Cloud 的/cluster/config 目录下下载最新的EMLStudio.war包,并将该包通过以下命令拷贝到hadoop-master容器的tomcat目录下重新部署即可。

docker cp your_dir/EMLStudio.war hadoop-master:/usr/local/tomcat/webapps/ //Copy file from your own entity machine to docker continer

同时我们已更新pom.xml文件在github工程中,您可以pull一下我们的代码。 123456


其他基本操作

  • 关闭及删除容器
sh stop_containers.sh//关闭mysql、master、slave1、slave2容器
  • 启动已经停止的容器
docker start container_name //启动某个容器
  • 删除cluster镜像
sh rm_images.sh //删除cluster镜像
  • 部署工程到tomcat
docker cp 工程路径 hadoop-master:/usr/local/tomcat/webapps/ 
  • 将容器创建一个新镜像
docker commit 容器名称 镜像名称 
  • 保存镜像
docker save 镜像名称 > 新镜像名称.tar
  • 删除某镜像
docker rmi 镜像名称

重启电脑或关闭docker,保存docker状态流程

  • 打开Orcle VM VirtualBox,右键Default虚拟机,退出,保存状态,使得Default虚拟机休眠
  • 重启电脑之后,只需打开Oracle VM VirtualBox,右键Default虚拟机启动,即可直接打开EML系统

重启电脑或关闭docker,未保存docker状态,部署EasyML流程

  • docker ps 查看所有容器是否启动,若没启动,则启动hadoop、mysql容器
docker start hadoop-master 
docker start hadoop-slave1
docker start hadoop-slave2
docker start mysql
  • 在安装文件根目录执行restart_service.sh,若ssh服务未启动成功,进入对应容器执行如下命令
/etc/init.d/ssh start
  • 进入hadoop-master容器根目录执行restart.sh

单独重启相关服务

  • 重启Hadoop,进入hadoop-master容器
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
  • 重启Spark,进入hadoop-master容器下的spark安装目录启动spark
/usr/local/spark-2.0.1-bin-hadoop2.7/sbin/start-all.sh
  • 重启Oozie,进入oozie安装目录启动oozie
cd /usr/local/oozie/oozie-server/temp
rm -rf oozie.pid //删除已有的oozie.pid进程
$HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver(和oozie日志相关)
$OOZIE_HOME/bin/oozie-start.sh
  • 重启Tomcat,进入tomcat安装目录启动tomcat
cd /usr/local/tomcat/bin
sh startup.sh 
Clone this wiki locally