初学者,利用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,成功,就说明好用。