最近正在上Hadoop的课程,需要做一个project验收。老师的要求是搭建一个Hadoop集群,1个namenode和2个datanode,老师交代只用自己的笔记本跑就可以,搭三个虚拟机运行下就好,然鹅,我的笔记本是lowlow的i3,内存也只有4GB(扎心),平时跑一个虚拟机都算勉强,再跑一个都够呛,此时,我灵光一闪,用docker试试吧,然后上网了解了下用docker跑Hadoop的可能性,结果受到了万分打击,网友们纷纷建议hadoop最好不要在docker上跑,以及4G内存没资格跑hadoop等等。但是我要完成我的project,只能硬着头皮装docker+hadoop,当然,我选择在服务器上装,实在是4G真心不经跑。
系统搭建:docker + hadoop2.7.3+jdk1.8.1。服务器:centos6.5(版本很老,但是boss不让升级) 基本过程是按照博客:https://blog.csdn.net/liuyunshengsir/article/details/79128948和https://blog.csdn.net/xu470438000/article/details/50512442综合而成。其实两篇博文描述的过程都一样,但是博文二在三个节点通信的时候采用的是pipework来桥接。但是我试了很久,总是失败的。所以我采用了博文一。
1.安装docker
yum search docker
yum install docker-io
2.检测docker是否可以运行
# 启动docker指令
service docker start
# 停止docker指令
servicce docker stop
如果出现以下的提示就说明docker安装成功了
如果出现了错误,使用 docker -d 等待一段时间再重新启动。
3.构建镜像文件
(1)第一个镜像:cento-ssh-root镜像
mkdir centos-ssh-root # 创建一个目录
cd centos-ssh-root
vi Dockerfile
然后把以下的内容copy到Dockerfile中,注意:该镜像的root用户密码为root,可以自己修改下面的文件重新设置密码。
用到的包:which ,wget 到http://mirror.centos.org/centos-7/7/os/x86_64/Packages/处下载。
# 选择一个已有的os镜像作为基础
FROM centos
# 镜像的作者
MAINTAINER ge
# 安装openssh-server和sudo软件包,并且将sshd的UsePAM参数设置成no
RUN yum install -y openssh-server sudo
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
#安装openssh-clients
RUN yum install -y openssh-clients
# 添加测试用户root,密码root,并且将此用户添加到sudoers里
RUN echo "root:root" | chpasswd
RUN echo "root ALL=(ALL) ALL" >> /etc/sudoers
# 下面这两句比较特殊,在centos6上必须要有,否则创建出来的容器sshd不能登录
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
# 启动sshd服务并且暴露22端口
RUN mkdir /var/run/sshd
# 预装一些命令后面需要使用,也可以不安装,到后面再安装
ADD which-2.20-7.el7.x86-64.rpm /usr/local/
RUN rpm -i /usr/local/which-2.20-7.el7.x86-64.rpm
RUN rom -qa
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
构建以下命令构建镜像(注意最后有个句点表示当前目录)
docker build -t="ge/centos-ssh-root" .
(2)第二个镜像 :centos-ssh-root-jdk
mkdir centos-ssh-root-jdk # 创建一个目录
cd centos-ssh-root-jdk
vi Dockerfile
cp jdk包的地址 . # 把jdk1.8拷贝到当前目录下
然后把以下的内容copy到Dockerfile中
用到的包:jdk1.8,网上可以找到资源。
FROM ge/centos-ssh-root # 依赖的上一个镜像名称
ADD jdk-8u162-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_162 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH
构建以下命令构建镜像(注意最后有个句点表示当前目录)
docker build -t="ge/centos-ssh-root-jdk" .
(3)第三个镜像
mkdir centos-ssh-root-jdk-hadoop
cd centos-ssh-root-jdk-hadoop
cp hadoop安装包的地址 . # 把hadoop拷贝到当前目录下
Vi Dockerfile
然后把以下的内容copy到Dockerfile中
用到的包:hadoop-2.7.3,网上可以找到资源。
FROM ge/centos-ssh-root-jdk
ADD hadoop-2.7.3.tar.gz /usr/local/
RUN mv /usr/local/hadoop-2.7.3 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH
构建以下命令构建镜像(注意最后有个句点表示当前目录)
docker build -t="ge/centos-ssh-root-jdk-hadoop" .
4.搭建hadoop集群
(1)启动三个容器,分别是hadoop0(主),hadoop1,hadoop2(从)
执行以下命令,注意directory1和directory2是自己设置的,可以看下面的解释
docker run --name hadoop0 -v directory1:directory2 --hostname hadoop0 -d -P -p 50070:50070 -p 8088:8088 ge/centos-ssh-root-jdk-hadoop
docker run --name hadoop1 -v directory1:directory2 --hostname hadoop1 -d -P ge/centos-ssh-root-jdk-hadoop
docker run --name hadoop2 -v directory1:directory2 --hostname hadoop2 -d -P ge/centos-ssh-root-jdk-hadoop
这样就启动了三个容器,用下述命令可以查看容器运行状态
docker ps
(2) 使用下面的指令查看三个节点的IP。然后在每个节点的/etc/hosts中配置起来。
docker inspect -f='{{.Name}} {{.NetworkSettings.IPAddress}} {{.HostConfig.PortBindings}}' $(docker ps -aq)
(3)接下来就是正常的hadoop的配置操作,这里就不再赘述,有时间回来再补上
【注】由于docker是为容器分配临时IP,当docker重新启动时,每个容器的IP就改变了,所以/etc/hosts要重新配置。如果想避免这一麻烦,可以使用pipework来固定IP。
因为是在docker上运行,之前不常用docker,所以docker的指令很陌生,在这里记录一些些。
# 创建并运行一个容器
docker run -it -v directory1:directory2 containername /bin/bash
# 解释:imagename:容器名称。
#如果不需要与主机进行文件共享的话,可以不加-v directory1:directory2。但是由于我是在服务器上搭建的,如果不共享目录,着实难受(但是之前的两篇博文没有这个,所以我没有创建共享目录,之后采用很麻烦的方法来进行文件传输)。
#解释下directory1是表示主机上的文件地址的绝对路径,而directory2则是容器的文件地址的绝对路径。
#这样directory1和directory2便连在一起啦(也就是文件挂载)
# 查看容器的运行状态
docker ps -a
# 可以看看每个容器status,就知道每个容器的运行状态。
#开启容器
docker start containername
#关闭容器
docker stop containername
#进入容器
docker exec -it containername /bin/bash
#退出容器但是不关闭容器
ctrl+P+Q
#主机和docker容器间的文件传输
主机->docker容器
docker cp file_path containername:container_file_path
docker容器->主机
docker cp containername:container_file_path file_path
5.eclipse上debug hadoop程序
参考如下博文:https://blog.csdn.net/wudichengyaojin/article/details/64440655