初学者,利用docker部署hadoop集群。

根据他人的思路自己操作了一遍。

原作者文章地址:

作者将镜像分了好几个层次,这里可以只做成一个镜像系统。

系统是centos7。hadoop版本2.6.0。

*********************************************************

先创建一个基础镜像。

一、安装docker,通过yum直接装默认版

yum -y install docker

二、启动docker服务

service docker start

三、关闭防火墙,重启系统,启动镜像

systemctl stop firewalld.service

systemctl disable firewalld.service

重启虚拟机reboot -h

开启镜像:

docker run -it centos /bin/bash

可以正常进入,就说明镜像没有问题。

********************************************************

四、再创建一个具有ssh的镜像,使用dockerfile的方式。

在宿主机上(不是容器里)

mkdir centos-ssh

cd centos-ssh

vi dockerfile    将如下内容编辑进去。

    #选择一个已有的镜像

    from docker.io/centos

    #安装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

    #安装poenssh-clients

    run yum install -y openssh-clients

    #添加用户root,密码是123456,将用户添加到sudoers中

    run echo "root:123456" | chpasswd

    run echo "root ALL=(ALL) ALL" >> /etc/sudoers

    # 下面这两句比较特殊,在centos6上必须要有,否则创建出来的容器sshd不能登录  

    # 我的是centos7,但是也添加了这句。

    run ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key

    run ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

    #启动ssh,并且设置端口为22

    run mkdir /var/run/sshd

    expose 22

    CMD ["/usr/sbin/sshd", "-D"]

保存退出。创建镜像。

docker build -t="centos-ssh" .

名字自己起。要注意后面的那个点,由此才能执行到dockerfile。

docker p_w_picpaths一下,可以看到镜像构建成功。

*****************************************************

五、再构建带有jdk的镜像

在宿主机上,同样通过dockerfile的方式,步骤也一样,很容易记住。

mkdir centos-ssh-jdk

cd centos-ssh-jdk

vi dockerfile

    from crxy/centos-ssh-root

    add jdk-8u11-linux-x64.tar.gz /usr/local/

    run mv /usr/local/jdk1.8.0_11 /usr/local/jdk1.8

    env JAVA_HOME /usr/local/jdk1.8

    env PATH $JAVA_HOME/bin:$PATH

保存退出。创建镜像。

docker build -t"centos-ssh-jdk" .

查看下镜像中是否创建成功。

******************************************************

六、再构建一个带hadoop的镜像。

mkdir centos-ssh-jdk-hadoop

cd centos-ssh-jdk-hadoop

    vi dockerfile

    vim dockerfile

    from crxy/centos-ssh-root-jdk

    add hadoop-2.6.0-cdh5.5.2.tar.gz /usr/local/

    run mv /usr/local/hadoop-2.6.0-cdh5.5.2 /usr/local/hadoop

    env HADOOP_HOME /usr/local/hadoo

    env PATH $HADOOP_HOME/bin:$PATH

保存退出。创建镜像。

docker build -t"centos-ssh-jdk-hadoop" .

查看下镜像中是否创建成功。

**************************************************************

七、最后,构建hadoop集群(容器没做持久化,并重启了的话,需要重新在此步开始)

基于hadoop镜像,开启三个容器,也就是三个节点了,这里一主二从。

hadoop0,hadoop1,hadoop2

[root@qpf00 ~]# docker run --name hadoop0 --hostname hadoop0 -d -P -p 50070:50070 centos-ssh-jdk-hadoop

[root@qpf00 ~]# docker run --name hadoop1 --hostname hadoop1 -d -P centos-ssh-jdk-hadoop

[root@qpf00 ~]# docker run --name hadoop2 --hostname hadoop2 -d -P centos-ssh-jdk-hadoop

八、利用pipework给容器设置固定的IP地址。

自己百度一个pipework工具。当时的下载链接忘了,把这个传到51CTO了。

将工具传到宿主机上,

[root@qpf00 ~]# unzip pipework-master.zip

[root@qpf00 ~]# mv pipework-master pipework

将pipework命令复制一份到/usr/local/bin/这个目录下

[root@qpf00 pipework]# cp pipework /usr/local/bin/

九、安装bridge-utils

yum -y install bridge-utils

十、创建网络

这里需要建立一个逻辑网段(网桥),用来连接网络。

brctl addbr br0

修改br0的属性状态为开启

ip link set dev br0 up

设置宿主机:192.168.44.1\24 这表示一个网段。网络地址 192.168.1.0 、广播地址192.168.1.255可用地址 192.168.1.1--254

ip addr add 192.168.44.130/24 dev br0

至此,宿主机的IP地址就是192.168.44.130

十一、给三个容器(节点)分配IP地址

[root@qpf00 pipework]# pipework br0 hadoop0 192.168.44.10/24

[root@qpf00 pipework]# pipework br0 hadoop1 192.168.44.11/24

[root@qpf00 pipework]# pipework br0 hadoop2 192.168.44.12/24

相互ping通的话,说明集群没问题。

但是,无法连接外网。这个配置了好久,都没能连上外网。。。哎。前期还是可以连上的呢。配置完就不能了。

十二、给三个节点(容器)做ssh

先进入主节点:在hadoop1和hadoop2中,做同样的操作。

先做IP与主机名的映射

docker ecec -it hadoop0 /bin/bash

vi /etc/hosts

192.168.44.130    qpf00

192.168.44.10   hadoop0

192.168.44.11   hadoop1

192.168.44.12   hadoop2

创建秘钥

[root@hadoop0 ~]# mkdir .ssh

[root@hadoop0 ~]# cd .ssh

[root@hadoop0 .ssh]# ssh-keygen -t rsa(一直按回车即可)

[root@hadoop0 .ssh]# ssh-copy-id -i qpf00(这个是宿主机主机名,记住输入yes) 

[root@hadoop0 .ssh]# ssh-copy-id -i hadoop0(配置三个从节点的秘钥)

[root@hadoop0 .ssh]# ssh-copy-id -i hadoop1 

[root@hadoop0 .ssh]# ssh-copy-id -i hadoop2

在hadoop1和hadoop2中,做同样的操作。

十三、配置hadoop集群

进入hadoop0,即主节点上.

配置core-site.xml/yarn-site.xml/mapred.xml/hdfs-site.xml/hadoop-env.sh

1,vi core-site.xml

<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>

2,vi yarn-site.xml

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

<property>

<name>yarn.log-aggregation-enable</name>

<value>true</value>

</property>

<property>

<description>The hostname of the RM.</description>

<name>yarn.resourcemanager.hostname</name>

<value>hadoop0</value>

</property>

3,先mv mapred-site.xml.template mapred-site.xml,再vi mapred-site.xml

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

4,vi dhfs-site.xml

<property>

<name>dfs.replication</name>

<value>1</value>

</property>

<property>

<name>dfs.permissions</name>

<value>false</value>

</property>

5,vi hadoop-env.sh

export JAVA_HOME=/usr/local/jdk1.8

6,vi slaves

hadoop1

hadoop2

7,在hadoop0中执行命令:将hadoop拷贝给从节点

scp  -rq /usr/local/hadoop   hadoop1:/usr/local

scp  -rq /usr/local/hadoop   hadoop2:/usr/local

8,还要在三个容器中安装which工具

安装的是rpm包,包下载地址:

先传到宿主机上,再传到三个容器中

[root@qpf00 ~]# docker cp which-2.20-7.el7.x86_64.rpm hadoop0:/usr/local/

[root@qpf00 ~]# docker cp which-2.20-7.el7.x86_64.rpm hadoop1:/usr/local/

[root@qpf00 ~]# docker cp which-2.20-7.el7.x86_64.rpm hadoop2:/usr/local/

之后,rpm -ivh which-2.20-7.el7.x86_64.rpm就好了。

十四、全部配置完,就可以格式化hadoop集群,然后启动了。

在主节点上,执行

cd /usr/local/hadoop

bin/hdfs namenode -format

出现successfully formatted。集群搭建成功。

接着启动集群

sbin/start-all.sh

10,检测集群是否好用。

jps一下看看

主节点:

762 NameNode

926 SecondaryNameNode

1055 ResourceManager

1455 Jps

从节点:

354 NodeManager

259 DataNode

471 Jps

到/usr/local/hadoop中,

创建个HDFS目录/bin/hadoop fs -mkdir /user目录

查看是否有刚才建的目录/bin/hadoop fs -ls /

然后上传一个字频文档,利用hadoop自身带的wordcount跑一下mapreduce,成功,就说明好用。