分享

Linux中搭建通过docker搭建hadoop分布式集群教程

本帖最后由 Oner 于 2016-11-24 17:49 编辑
问题导读:
1.  启动docker可能出现哪些问题?如何解决?
2.  如何基于现有镜像创建新的镜像?
3.  搭建hadoop集群的步骤有哪些?
4. 如何设置ssh免密码登录
5. 需要修改那些配置文件?
6. 如何判断集群正常启动了?
7. 如何解决重启集群后配置好的固定ip消失问题?


使用Docker搭建部署Hadoop分布式集群
在网上找了很长时间都没有找到使用docker搭建hadoop分布式集群的文档,没办法,只能自己写一个了。

一:环境准备:

1:首先要有一个Centos7操作系统,可以在虚拟机中安装。

2:在centos7中安装docker,docker的版本为1.8.2

安装步骤如下:
<1>安装制定版本的dockeryum install -y docker-1.8.2-10.el7.centos

<2>安装的时候可能会报错,需要删除这个依赖
20160115104204628.png
[mw_shl_code=applescript,true]rpm -e lvm2-7:2.02.105-14.el7.x86_64[/mw_shl_code]
启动docker
[mw_shl_code=applescript,true]service docker start[/mw_shl_code]
验证安装结果:
20160113182130549.png

<3>启动之后执行docker info会看到下面有两行警告信息
20160115104417598.png
需要关闭防火墙并重启系统
[mw_shl_code=applescript,true]systemctl stop firewalld
systemctl disable firewalld
注意:执行完上面的命令之后需要重启系统
reboot -h(重启系统)[/mw_shl_code]

<4>运行容器可能会报错
20160115104543491.png

需要关闭selinux
解决方法:
1):setenforce 0(立刻生效,不需要重启操作系统)2):修改/etc/selinux/config文件中的SELINUX=disabled ,然后重启系统生效建议两个步骤都执行,这样可以确保系统重启之后selinux也是关闭状态

3:需要先构建一个hadoop的基础镜像,使用dockerfile文件方式进行构建。
先构建一个具备ssh功能的镜像,方便后期使用。(但是这样对于容器的安全性会有影响)
注意:这个镜像中的root用户的密码是root
Mkdir centos-ssh-root
Cd centos-ssh-root
Vi Dockerfile
[mw_shl_code=applescript,true]# 选择一个已有的os镜像作为基础  
FROM centos

# 镜像的作者  
MAINTAINER crxy

# 安装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  
EXPOSE 22  
CMD ["/usr/sbin/sshd", "-D"][/mw_shl_code]
构建命令:
docker build -t=”crxy/centos-ssh-root” .
查询刚才构建成功的镜像
20160113182221284.png

4:基于这个镜像再构建一个带有jdk的镜像
注意:jdk使用的是1.7版本的
Mkdir centos-ssh-root-jdk
Cd centos-ssh-root-jdk
Cp ../jdk-7u75-Linux-x64.tar.gz .
Vi Dockerfile
[mw_shl_code=applescript,true]FROM crxy/centos-ssh-root
ADD jdk-7u75-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.7.0_75 /usr/local/jdk1.7
ENV JAVA_HOME /usr/local/jdk1.7
ENV PATH $JAVA_HOME/bin:$PATH[/mw_shl_code]
构建命令:
docker build -t=”crxy/centos-ssh-root-jdk” .
查询构建成功的镜像

5:基于这个jdk镜像再构建一个带有hadoop的镜像
注意:hadoop使用的是2.4.1版本的。
Mkdir centos-ssh-root-jdk-hadoop
Cd centos-ssh-root-jdk-hadoop
Cp ../hadoop-2.4.1.tar.gz .
Vi Dockerfile
[mw_shl_code=applescript,true]FROM crxy/centos-ssh-root-jdk
ADD hadoop-2.4.1.tar.gz /usr/local
RUN mv /usr/local/hadoop-2.4.1 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH[/mw_shl_code]
构建命令:
docker build -t=”crxy/centos-ssh-root-jdk-hadoop” .
查询构建成功的镜像
20160113182257735.png


二:搭建hadoop分布式集群

1:集群规划

准备搭建一个具有三个节点的集群,一主两从
主节点:hadoop0 ip:192.168.2.10
从节点1:hadoop1 ip:192.168.2.11
从节点2:hadoop2 ip:192.168.2.12
但是由于docker容器重新启动之后ip会发生变化,所以需要我们给docker设置固定ip。使用pipework给docker容器设置固定ip

2:启动三个容器,分别作为hadoop0 hadoop1 hadoop2

在宿主机上执行下面命令,给容器设置主机名和容器的名称,并且在hadoop0中对外开放端口50070 和8088
[mw_shl_code=applescript,true]docker run --name hadoop0 --hostname hadoop0 -d -P -p 50070:50070 -p 8088:8088 crxy/centos-ssh-root-jdk-hadoop

docker run --name hadoop1 --hostname hadoop1 -d -P crxy/centos-ssh-root-jdk-hadoop

docker run --name hadoop2 --hostname hadoop2 -d -P crxy/centos-ssh-root-jdk-hadoop[/mw_shl_code]
使用docker ps 查看刚才启动的是三个容器
20160113182401800.png

3:给这三台容器设置固定IP

1):下载pipework
下载地址:https://github.com/jpetazzo/pipework.git
2):把下载的zip包上传到宿主机服务器上,解压,改名字
[mw_shl_code=applescript,true]unzip pipework-master.zip
mv pipework-master pipework
cp -rp pipework/pipework /usr/local/bin/ [/mw_shl_code]
3):安装bridge-utils
[mw_shl_code=applescript,true]yum -y install bridge-utils[/mw_shl_code]
4):创建网络
[mw_shl_code=applescript,true]brctl addbr br0
ip link set dev br0 up
ip addr add 192.168.2.1/24 dev br0[/mw_shl_code]
5):给容器设置固定ip
[mw_shl_code=applescript,true]pipework br0 hadoop0 192.168.2.10/24
pipework br0 hadoop1 192.168.2.11/24
pipework br0 hadoop2 192.168.2.12/24[/mw_shl_code]
验证一下,分别ping三个ip,能ping通就说明没问题
20160113182443522.png

4:配置hadoop集群
先连接到hadoop0上,
使用命令
[mw_shl_code=applescript,true]docker exec -it hadoop0 /bin/bash[/mw_shl_code]
下面的步骤就是hadoop集群的配置过程
1):设置主机名与ip的映射,修改三台容器:vi /etc/hosts
添加下面配置
[mw_shl_code=applescript,true]192.168.2.10    hadoop0
192.168.2.11    hadoop1
192.168.2.12    hadoop2[/mw_shl_code]
2):设置ssh免密码登录
在hadoop0上执行下面操作
[mw_shl_code=applescript,true]cd  ~
mkdir .ssh
cd .ssh
ssh-keygen -t rsa(一直按回车即可)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop0
ssh-copy-id -i hadoop1
ssh-copy-id -i hadoop2
在hadoop1上执行下面操作
cd  ~
cd .ssh
ssh-keygen -t rsa(一直按回车即可)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop1
在hadoop2上执行下面操作
cd  ~
cd .ssh
ssh-keygen -t rsa(一直按回车即可)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop2[/mw_shl_code]
3):在hadoop0上修改hadoop的配置文件
进入到/usr/local/hadoop/etc/hadoop目录
修改目录下的配置文件core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml
(1)hadoop-env.sh
[mw_shl_code=applescript,true]export JAVA_HOME=/usr/local/jdk1.7[/mw_shl_code]
(2)core-site.xml
[mw_shl_code=applescript,true]<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://hadoop0:9000</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/usr/local/hadoop/tmp</value>
        </property>
         <property>
                 <name>fs.trash.interval</name>
                 <value>1440</value>
        </property>
</configuration>[/mw_shl_code]
(3)hdfs-site.xml
[mw_shl_code=applescript,true]<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
</configuration>[/mw_shl_code]
(4)yarn-site.xml
[mw_shl_code=applescript,true]<configuration>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.log-aggregation-enable</name>
                <value>true</value>
        </property>
</configuration>[/mw_shl_code]
(5)修改文件名:mv mapred-site.xml.template mapred-site.xml
vi mapred-site.xml
[mw_shl_code=applescript,true]<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>[/mw_shl_code]
(6)格式化
进入到/usr/local/hadoop目录下
1、执行格式化命令
[mw_shl_code=applescript,true]bin/hdfs namenode -format
注意:在执行的时候会报错,是因为缺少which命令,安装即可

执行下面命令安装
yum install -y which[/mw_shl_code]
看到下面命令说明格式化成功。
20160113182759812.png
格式化操作不能重复执行。如果一定要重复格式化,带参数-force即可。
(7)启动伪分布hadoop
[mw_shl_code=applescript,true]命令:sbin/start-all.sh[/mw_shl_code]
第一次启动的过程中需要输入yes确认一下。
20160113182829796.png
使用jps,检查进程是否正常启动?能看到下面几个进程表示伪分布启动成功
[mw_shl_code=applescript,true][root@hadoop0 hadoop]# jps
3267 SecondaryNameNode
3003 NameNode
3664 Jps
3397 ResourceManager
3090 DataNode
3487 NodeManager[/mw_shl_code]
(8)停止伪分布hadoop
[mw_shl_code=applescript,true]命令:sbin/stop-all.sh[/mw_shl_code]
(9)指定nodemanager的地址,修改文件yarn-site.xml
[mw_shl_code=applescript,true]<property>
    <description>The hostname of the RM.</description>
    <name>yarn.resourcemanager.hostname</name>
    <value>hadoop0</value>
  </property>[/mw_shl_code]
(10)修改hadoop0中hadoop的一个配置文件etc/hadoop/slaves
删除原来的所有内容,修改为如下
[mw_shl_code=applescript,true]hadoop1
hadoop2[/mw_shl_code]
(11)在hadoop0中执行命令
[mw_shl_code=applescript,true]  scp  -rq /usr/local/hadoop   hadoop1:/usr/local
  scp  -rq /usr/local/hadoop   hadoop2:/usr/local[/mw_shl_code]
(12)启动hadoop分布式集群服务
[mw_shl_code=applescript,true]执行sbin/start-all.sh[/mw_shl_code]
注意:在执行的时候会报错,是因为两个从节点缺少which命令,安装即可
分别在两个从节点执行下面命令安装
[mw_shl_code=applescript,true]yum install -y which[/mw_shl_code]
再启动集群(如果集群已启动,需要先停止)
[mw_shl_code=applescript,true]sbin/start-all.sh[/mw_shl_code]
(13)验证集群是否正常
首先查看进程:
Hadoop0上需要有这几个进程
[mw_shl_code=applescript,true][root@hadoop0 hadoop]# jps
4643 Jps
4073 NameNode
4216 SecondaryNameNode
4381 ResourceManager[/mw_shl_code]
Hadoop1上需要有这几个进程
[mw_shl_code=applescript,true][root@hadoop1 hadoop]# jps
715 NodeManager
849 Jps
645 DataNode[/mw_shl_code]
Hadoop2上需要有这几个进程
[mw_shl_code=applescript,true][root@hadoop2 hadoop]# jps
456 NodeManager
589 Jps
388 DataNode[/mw_shl_code]
使用程序验证集群服务
创建一个本地文件
[mw_shl_code=applescript,true]vi a.txt
hello you
hello me[/mw_shl_code]
上传a.txt到hdfs上
[mw_shl_code=applescript,true]hdfs dfs -put a.txt /[/mw_shl_code]
执行wordcount程序
[mw_shl_code=applescript,true]cd /usr/local/hadoop/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-2.4.1.jar wordcount /a.txt /out[/mw_shl_code]
查看程序执行结果
20160113183045014.png
这样就说明集群正常了。
通过浏览器访问集群的服务
由于在启动hadoop0这个容器的时候把50070和8088映射到宿主机的对应端口上了
[mw_shl_code=applescript,true]adb9eba7142b        crxy/centos-ssh-root-jdk-hadoop   "/usr/sbin/sshd -D"   About an hour ago   Up About an hour    0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:32770->22/tcp   hadoop0[/mw_shl_code]
所以在这可以直接通过宿主机访问容器中hadoop集群的服务
宿主机的ip为:192.168.1.144
[mw_shl_code=applescript,true]http://192.168.1.144:50070/
http://192.168.1.144:8088/[/mw_shl_code]
20160113183124256.png
20160113183142846.png


三:集群节点重启

停止三个容器,在宿主机上执行下面命令
[mw_shl_code=applescript,true]docker stop hadoop0
docker stop hadoop1
docker stop hadoop2[/mw_shl_code]
容器停止之后,之前设置的固定ip也会消失,重新再使用这几个容器的时候还需要重新设置固定ip
先把之前停止的三个容器起来
[mw_shl_code=applescript,true]docker start hadoop0
docker start hadoop1
docker start hadoop2[/mw_shl_code]
在宿主机上执行下面命令重新给容器设置固定ip
[mw_shl_code=applescript,true]pipework br0 hadoop0 192.168.2.10/24
pipework br0 hadoop1 192.168.2.11/24
pipework br0 hadoop2 192.168.2.12/24[/mw_shl_code]
还需要重新在容器中配置主机名和ip的映射关系,每次都手工写比较麻烦
写一个脚本,runhosts.sh
[mw_shl_code=applescript,true]#!/bin/bash
echo 192.168.2.10       hadoop0 >> /etc/hosts
echo 192.168.2.11       hadoop1 >> /etc/hosts
echo 192.168.2.12       hadoop2 >> /etc/hosts[/mw_shl_code]
添加执行权限,chmod +x runhosts.sh
把这个脚本拷贝到所有节点,并且分别执行这个脚本
[mw_shl_code=applescript,true]scp runhosts.sh  hadoop1:~
scp runhosts.sh  hadoop2:~[/mw_shl_code]
执行脚本的命令 ./runhosts.sh
查看/etc/hosts文件中是否添加成功
20160113183248586.png
注意:有一些docker版本中不会在hosts文件中自动生成下面这些映射,所以我们才在这里手工给容器设置固定ip,并设置主机名和ip的映射关系。
[mw_shl_code=applescript,true]172.17.0.25     hadoop0
172.17.0.25     hadoop0.bridge
172.17.0.26     hadoop1
172.17.0.26     hadoop1.bridge
172.17.0.27     hadoop2
172.17.0.27     hadoop2.bridge[/mw_shl_code]
启动hadoop集群
[mw_shl_code=applescript,true]sbin/start-all.sh[/mw_shl_code]

来源:CSDN
作者:xu470438000

已有(4)人评论

跳转到指定楼层
是饭饭 发表于 2016-11-24 22:22:26
真棒,学习了,感谢楼主
回复

使用道具 举报

a_zhen 发表于 2016-11-25 09:12:22
非常不错,very good
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条