在了解Hadoo基础之后,借助于docker快速实现虚拟化,搭建Hadoop集群,进一步了解Hadoop,实地测试,实地操作,更进一步的了解Hadoop。
首先需要了解Hadoop的各个模块概念已经功能,确定搭建怎么样集群。本文选择搭建一个如下的集群。
容器 | NameNode | DataNode | ResourceManager | NodeManager |
master2/172.16.0.2 | yes | no | yes | no |
slave3/172.16.0.3 | no | yes | no | yes |
slave4/172.16.0.4 | no | yes | no | yes |
一,准备
以Centos:7.5.1804为基础镜像,构建虚拟容器环境,用与搭建Hadoop集群。
安装Docker环境,Docker基础知识,Docker安装请参考《Docker实践(一)基础知识》
1.1,拉取centos:7.5.1804基础镜像
[root@ecs-7bc6-0001 centos]# docker pull centos:7.5.1804
7.5.1804: Pulling from library/centos
5ad559c5ae16: Pull complete
Digest: sha256:7a45e4a1efbaafc1d9aa89925b6fdb33288a96d35ea0581412316e2f0ad3720a
Status: Downloaded newer image for centos:7.5.1804
1.2,运行centos环境,并进入容器
[root@ecs-7bc6-0001 centos]# docker run -itd --name=centos centos:7.5.1804
[root@ecs-7bc6-0001 centos]# docker exec -it {containerId} /bin/bash
1.3,安装必要软件
更新yum源
[root@2bf5e492f205 /]# yum clean
[root@2bf5e492f205 /]# yum update
安装ssh-server,ssh-client
[root@2bf5e492f205 /]# yum install -y openssl openssh-server openssh-clients.x86_64
安装Java
[root@2bf5e492f205 /]# yum -y install java-1.8.0-openjdk.x86_64
[root@2bf5e492f205 /]# java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
[root@2bf5e492f205 /]# whereis java
java: /usr/bin/java /usr/lib/java /etc/java /usr/share/java /usr/share/man/man1/java.1.gz
退出容器,并提交修改到新的centos镜像版本
[root@ecs-7bc6-0001 centos]# docker commit -m"增加ssh java8" -a"weihao" 2bf5e492f205 centos:my
使用新镜像重新启动容器,并登入容器。
docker run -itd --name=centos --privileged centos:my /usr/sbin/init
注意增加--privileged,且entrypoint执行/usr/sbin/init,否则不能使用systemctl,ssh不能设置开机启动。
进入容器并设置ssh开机启动。
[root@ecs-7bc6-0001 centos]# docker exec -it {containerId} bash
[root@2bf5e492f205 /]#
[root@2bf5e492f205 /]# systemctl start sshd.service
[root@2bf5e492f205 /]# systemctl enable sshd.service
1.4,配置
1.4.1,下载hadoop安装包并解压
在容器/usr目录下下载hadoop,并解压安装包。
[root@2bf5e492f205 usr]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz
[root@2bf5e492f205 usr]#
[root@2bf5e492f205 usr]# tar -zxvf hadoop-2.7.7.tar.gz
1.4.2,配置环境变量
配置Java以及Hadoop的环境变量,在/etc/profile中增加环境变量
export JAVA_HOME=/usr
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_HOME=/usr/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
使环境变量生效,并测试
[root@master2 /]# source /etc/profile
[root@master2 /]# echo $HADOOP_HOME
/usr/hadoop-2.7.7
[root@master2 /]# echo $PATH
/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/hadoop-2.7.7/bin:/usr/hadoop-2.7.7/sbin
1.5,创建docker网络
需要以指定host和ip启动容器,docker默认的网络不支持指定Ip指定host,所以需要创建docker网络。使用docker network命令。
[root@ecs-7bc6-0001 centos]# docker network create --subnet 172.16.0.0/24 --gateway 172.16.0.1 hadoop
ecb59f50deebd3a63bdb06be42b6eb40bfabf9c0cc87c0768f6c0288a30c0dc2
[root@ecs-7bc6-0001 centos]#
[root@ecs-7bc6-0001 centos]#
[root@ecs-7bc6-0001 centos]#
[root@ecs-7bc6-0001 centos]# docker network ls
NETWORK ID NAME DRIVER SCOPE
342bed4d76fe bridge bridge local
ecb59f50deeb hadoop bridge local
5d65376d94d3 host host local
72d49606a862 none null local
--subnet 172.16.0.0/24,指定子网
--gateway 172.16.0.1,指定网关
hadoop,指定网络名称
1.6,配置无密码登录的ssh
配置无密码登录的ssh,请参考《无密码登录SSH》,三个容器公用一个密钥对,密钥在root的.ssh目录下,在.ssh/authorized_keys中添加三个容器的访问公钥,注意最后一列用户名和主机。
[root@master2 /]# cat root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0zLk33Xn371ydrPyttHWTHTG0p0BTvTZv8t/PqmBS3MoXWV6cP/aBDKRTGkgi9yAZhnNUE8bFfMMMkK7W+Yy0pti8TPyItj7HgFpDUr7gylq3VwYggAyOZjHwgW+19H4iousfu5YcKrbzdOVUN7Y29OumnIfOg06wGVsyXtFOsml2cyWLsfTO5gr6p2PrMWo2rTnorXHRbA5ZVPPnDgfKnbyD20WroJ7Yf70Yk1G2S4ZEZcWAjteuQCKtDVBYsi3KaG3WHxZ0jDQryqhlPT1KstYlA8trkyK7sJWHBGwNMOBdshiPud81mfYXuU+Rv8BYr3ChdBvmq29/gOD14KEH root@master2
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0zLk33Xn371ydrPyttHWTHTG0p0BTvTZv8t/PqmBS3MoXWV6cP/aBDKRTGkgi9yAZhnNUE8bFfMMMkK7W+Yy0pti8TPyItj7HgFpDUr7gylq3VwYggAyOZjHwgW+19H4iousfu5YcKrbzdOVUN7Y29OumnIfOg06wGVsyXtFOsml2cyWLsfTO5gr6p2PrMWo2rTnorXHRbA5ZVPPnDgfKnbyD20WroJ7Yf70Yk1G2S4ZEZcWAjteuQCKtDVBYsi3KaG3WHxZ0jDQryqhlPT1KstYlA8trkyK7sJWHBGwNMOBdshiPud81mfYXuU+Rv8BYr3ChdBvmq29/gOD14KEH root@slave3
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0zLk33Xn371ydrPyttHWTHTG0p0BTvTZv8t/PqmBS3MoXWV6cP/aBDKRTGkgi9yAZhnNUE8bFfMMMkK7W+Yy0pti8TPyItj7HgFpDUr7gylq3VwYggAyOZjHwgW+19H4iousfu5YcKrbzdOVUN7Y29OumnIfOg06wGVsyXtFOsml2cyWLsfTO5gr6p2PrMWo2rTnorXHRbA5ZVPPnDgfKnbyD20WroJ7Yf70Yk1G2S4ZEZcWAjteuQCKtDVBYsi3KaG3WHxZ0jDQryqhlPT1KstYlA8trkyK7sJWHBGwNMOBdshiPud81mfYXuU+Rv8BYr3ChdBvmq29/gOD14KEH root@slave4
1.7,配置hosts
在/etc/hosts中添加三个容器的ip和hostname对应关系。添加以下三行。
172.16.0.2 master2
172.16.0.3 slave3
172.16.0.4 slave4
退出容器,提交修改到新的centos镜像,准备工作完成
二,开始搭建
2.1,分别启动三个容器,指定IP,HOST等选项。
启动master2
docker run -itd --name=hadoop_master2 --net=hadoop --hostname=master2 --ip=172.16.0.2 --privileged -p 9000:9000 -p 8088:8088 -p 9001:9001 -v /home/work/docker/hadoop:/data centos:my2 /usr/sbin/init
-i,-t,-d,打开容器的标准输入,分配伪终端,且后台运行
--name,指定容器名称
--net,指定容器网络
--hostname,指定容器主机名称
--ip,指定容器ip
--privileged,容器中继承当前权限
-p 9000:9000 -p 8088:8088 -p 9001:9001,开放9000端口并映射到宿主即的9000端口,开放8088端口并映射到宿主即的8088端口,开放9001端口并映射到宿主即的9001端口
-v /home/work/docker/hadoop:/data,宿主机的/home/work/docker/hadoop映射到容器的/data目录
centos:my2,镜像名称和标签
/usr/sbin/init,entrypoint,支持systemctl
启动slave3,slave4
docker run -itd --name=hadoop_slave3 --net=hadoop --hostname=slave3 --ip=172.16.0.3 --privileged -v /home/work/docker/hadoop:/data centos:my2 /usr/sbin/init
docker run -itd --name=hadoop_slave4 --net=hadoop --hostname=slave4 --ip=172.16.0.4 --privileged -v /home/work/docker/hadoop:/data centos:my2 /usr/sbin/init
2.2,修改hadoop配置
2.2.1,修改core-site.xml,创建hadoop.tmp.dir对应目录,修改配置
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master2:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/data/temp</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>
2.2.2,修改hdfs-site.xml,在<configuration>标签下添加,其中配置中的目录/data/dfs/data和/data/dfs/name需要事先创建。也可以使用其他自定义目录,需要保证配置中的目录存在。
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master2:9001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/data/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/data/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.web.ugi</name>
<value>supergroup</value>
</property>
</configuration>
2.2.3,将mapred-site.xml.template复制一份为mapred-site.xml并修改
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master2:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master2:19888</value>
</property>
</configuration>
2.2.4,修改yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master2:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master2:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master2:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master2:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master2:8088</value>
</property>
</configuration>
2.3,启动hadoop
2.3.1,启动hdfs
在master2上启动namenode
$ hadoop-daemons.sh --script "$HADOOP_HOME/bin/hdfs" start namenode
在slave3,slave4上启动datanode
$ hadoop-daemons.sh --script "$HADOOP_HOME/bin/hdfs" start namenode
2.3.2,启动yarn
在master2上启动ResourceManager
hadoop-daemons.sh --script "$HADOOP_HOME/bin/yarn" start resourcemanager
在slave3,slave4上启动NodeManager
hadoop-daemons.sh --script "$HADOOP_HOME/bin/yarn" start nodemanager
三,测试
3.1,查看进程
通常使用jps查看JVM进程,但是简装的openjdk没有jps命令,使用ps -aux查看可以看到resourceManager和namenode进程
[root@master2 hadoop]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 311 0.1 5.6 2778488 454748 ? Sl Jul24 3:03 /usr/bin/java -Dproc_namenode -Xmx1000m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/usr/hadoop-2.7.7/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/usr/hadoop-2.7.
root 455 0.3 5.8 2935432 468584 ? Sl Jul24 10:33 /usr/bin/java -Dproc_resourcemanager -Xmx1000m -Dhadoop.log.dir=/usr/hadoop-2.7.7/logs -Dyarn.log.dir=/usr/hadoop-2.7.7/logs -Dhadoop.log.file=yarn.log -Dyarn.log.file=yarn.lo
root 967 0.0 0.0 11820 1684 pts/1 Ss+ Jul24 0:00 bash
3.2,打开namenode网页端,端口9001
3.3,打开resourcemanager网页端,端口8088
hadoop简单集群搭建完成,下一步开始测试hdfs和mapreduce。
(完)(^_^)