从0开始搭建Hadoop2.x高可用集群(HDFS篇)
- 演示目标
- 演示环境
- 注意事项
- 准备虚拟机
- 关闭防火墙
- 检查系统时间
- 修改host
- 设置免密登录
- 卸载OpenJDK
- 安装软件
- 准备HDFS
- 配置cote-site.xml
- 配置hdfs-site.xml
- 配置slaves
- 配置hadoop-env
- 拷贝配置
- 准备Zookeeper
-
- 启动集群
-
- 验证高可用(HA)
演示目标
搭建双NameNode节点的高可用集群,其中一台节点的状态为Active,另一台是standby。当Active节点发生故障时,standby节点能自动接管并切换到Active状态。
演示环境
软件 | 备注 |
---|
VMware Workstation | 15.5 |
CentOS | CentOS-7-x86_64-DVD-1804.iso |
JDK | jdk-8u211-linux-x64.tar.gz |
Hadoop | hadoop-2.6.5.tar.gz |
Zookeeper | zookeeper-3.4.14.tar.gz |
下载地址 | 若有需要请按需下载上述软件 |
注意事项
- 文章中所有shell命令都是以root用户进行操作,所以请优先使用
su root
命令切换用户; - 在输入shell命令前先阅读命令注释,以避免遗漏和错误。
- 可以使用虚拟机快照功能帮助自己在执行了错误的操作后进行回滚。
准备虚拟机
- 安装WMware Workstation,并使用CentOS7镜像创建三台虚拟机;
- 配置好三台虚拟机的网络环境使其之间能够相互Ping通(如何设置?),演示中所用的虚拟机网络信息如下:
HOSTNAME | IP |
---|
vm1 | 192.168.0.51 |
vm2 | 192.168.0.52 |
vm3 | 192.168.0.53 |
关闭防火墙
依次使用所有虚拟机执行下列命令
systemctl stop firewalld
systemctl disable firewalld
vim /etc/sysconfig/selinux
检查系统时间
依次使用所有虚拟机执行下列命令
timedatectl | grep Time
timedatectl set-timezone Asia/Shanghai
date
date -s '-8hour'
hwclock -w
修改host
使用虚拟机vm1执行下列命令
hostnamectl set-hostname vm1
使用虚拟机vm2执行下列命令
hostnamectl set-hostname vm2
使用虚拟机vm3执行下列命令
hostnamectl set-hostname vm3
使用虚拟机vm1执行下列命令
cat >> /etc/hosts << EOF
> 192.168.0.51 vm1
> 192.168.0.52 vm2
> 192.168.0.53 vm3
> EOF
scp /etc/hosts root@vm2:/etc/hosts
scp /etc/hosts root@vm3:/etc/hosts
设置免密登录
依次使用所有虚拟机执行下列命令
ssh localhost
exit
cd ~/.ssh/
ssh-keygen
vim /etc/ssh/ssh_config
使用虚拟机vm1执行下列命令
cd ~/.ssh/
cat id_rsa.pub >> authorized_keys
scp ~/.ssh/authorized_keys root@vm2:~/.ssh/
scp ~/.ssh/authorized_keys root@vm3:~/.ssh/
ssh vm1
exit
卸载OpenJDK
依次使用所有虚拟机执行下列命令
rpm -qa | grep java
tzdata-java-2018c-1.el7.noarch
python-javapackages-3.4.1-11.el7.noarch
java-1.7.0-openjdk-1.7.0.171-2.6.13.2.el7.x86_64
java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64
java-1.7.0-openjdk-headless-1.7.0.171-2.6.13.2.el7.x86_64
javapackages-tools-3.4.1-11.el7.noarch
java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
yum -y remove java-1.7.0-openjdk-1.7.0.171-2.6.13.2.el7.x86_64 \
java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64 \
java-1.7.0-openjdk-headless-1.7.0.171-2.6.13.2.el7.x86_64 \
java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
rpm -e --nodeps
安装软件
- 将下载好的JDK、Hadoop、Zookeeper压缩包拷贝到vm1机器的/opt目录下,可以使用Xftp(官方下载地址)工具进行拷贝;
- 使用
tar -zxvf xxx.tar.gz
依次解压三个压缩包。 - 配置环境变量:
使用虚拟机vm1执行下列命令
vim /etc/profile
export JAVA_HOME=/opt/jdk1.8.0_211
export HADOOP_HOME=/opt/hadoop-2.6.5
export ZK_HOME=/opt/zookeeper-3.4.14
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
export PATH=$HADOOP_HOME/bin:$PATH
export PATH=$HADOOP_HOME/sbin:$PATH
export PATH=$ZK_HOME/bin:$PATH
source /etc/profile
scp -rp /opt/jdk1.8.0_211/ root@vm2:/opt/
scp -rp /opt/jdk1.8.0_211/ root@vm3:/opt/
scp -rp /opt/hadoop-2.6.5/ root@vm2:/opt/
scp -rp /opt/hadoop-2.6.5/ root@vm3:/opt/
scp -rp /opt/zookeeper-3.4.14/ root@vm2:/opt/
scp -rp /opt/zookeeper-3.4.14/ root@vm3:/opt/
scp /etc/profile root@vm2:/etc/
scp /etc/profile root@vm3:/etc/
使用虚拟机vm2执行下列命令
source /etc/profile
使用虚拟机vm3执行下列命令
source /etc/profile
准备HDFS
- 查看官方文档的方式:
- 官方在线文档;
- 在Windows中打开hadoop-xxx.tar.gz压缩包中根目录下的\share\doc\hadoop\index.html可以查看当前版本的离线文档;
- 节点部署情况 :
| NameNode | DataNode | JournalNode | Zookeeper |
---|
vm1 | ✔ | ✔ | ✔ | ✔ |
vm2 | ✔ | ✔ | ✔ | ✔ |
vm3 | | ✔ | ✔ | ✔ |
配置cote-site.xml
使用虚拟机vm1执行下列命令
cd /opt/hadoop-2.6.5/etc/hadoop
vim core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hdfs-cluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>vm1:2181,vm2:2181,vm3:2181</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop-2.6.5/tmp</value>
</property>
</configuration>
配置hdfs-site.xml
使用虚拟机vm1执行下列命令
cd /opt/hadoop-2.6.5/etc/hadoop
vim hdfs-site.xml
<configuration>
<property>
<name>dfs.nameservices</name>
<value>hdfs-cluster</value>
</property>
<property>
<name>dfs.ha.namenodes.hdfs-cluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hdfs-cluster.nn1</name>
<value>vm1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hdfs-cluster.nn2</name>
<value>vm2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.hdfs-cluster.nn1</name>
<value>vm1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.hdfs-cluster.nn2</name>
<value>vm2:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://vm1:8485;vm2:8485;vm3:8485/hdfs-cluster</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.hdfs-cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop-2.6.5/data/journalnode</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
配置slaves
使用虚拟机vm1执行下列命令
cd /opt/hadoop-2.6.5/etc/hadoop
vim slaves
vm1
vm2
vm3
配置hadoop-env
使用虚拟机vm1执行下列命令
vim /opt/hadoop-2.6.5/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/opt/jdk1.8.0_211
拷贝配置
使用虚拟机vm1执行下列命令
scp -rp /opt/hadoop-2.6.5/etc/hadoop root@vm2:/opt/hadoop-2.6.5/etc/
scp -rp /opt/hadoop-2.6.5/etc/hadoop root@vm3:/opt/hadoop-2.6.5/etc/
准备Zookeeper
使用vm1、vm2、vm3搭建Zookeeper集群。
配置zoo.cfg
使用虚拟机vm1执行下列命令
cd /opt/zookeeper-3.4.14/conf/
vim zoo.cfg
tickTime=2000
dataDir=/opt/zookeeper-3.4.14/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=vm1:2888:3888
server.2=vm2:2888:3888
server.3=vm3:2888:3888
scp /opt/zookeeper-3.4.14/conf/zoo.cfg root@vm2:/opt/zookeeper-3.4.14/conf/
scp /opt/zookeeper-3.4.14/conf/zoo.cfg root@vm3:/opt/zookeeper-3.4.14/conf/
mkdir /opt/zookeeper-3.4.14/data -p
cd /opt/zookeeper-3.4.14/data
echo '1' > myid
使用虚拟机vm2执行下列命令
mkdir /opt/zookeeper-3.4.14/data -p
cd /opt/zookeeper-3.4.14/data
echo '2' > myid
使用虚拟机vm3执行下列命令
mkdir /opt/zookeeper-3.4.14/data -p
cd /opt/zookeeper-3.4.14/data
echo '3' > myid
启动集群
在启动过程中,如果有问题,应该优先查看日志。
- 查看日志可以使用
tail -f -n 100 /xx/xxx
进行查看; - Zookeeper日志查看zookeeper.out文件;
- HDFS日志查看Hadoop根目录下的logs文件夹;
启动Zookeeper集群
依次使用所有虚拟机执行下列命令
zkServer.sh start
启动HDFS集群
- 全面启动HDFS使用
start-dfs.sh
; - 全面停止HDFS使用
stop-dfs.sh
; - 首次启动HDFS集群时,不能直接使用
start-dfs.sh
,此时需要一些额外操作,主要是为了格式化NameNode。首次启动操作如下:
首次启动
使用虚拟机vm1执行下列命令
hadoop-daemons.sh start journalnode
hdfs namenode -format
hadoop-daemon.sh start namenode
使用虚拟机vm2执行下列命令
hdfs namenode -bootstrapStandby
hadoop-daemon.sh start namenode
hdfs zkfc -formatZK
stop-dfs.sh
start-dfs.sh
验证高可用(HA)
- 在Windows中使用浏览器打开两个NameNode的地址:
http://192.168.0.51:50070
http://192.168.0.52:50070
- 如图所示,此时vm1虚拟机上的NameNode节点为
Active
状态:
![验证高可用(1)](https://img-blog.csdnimg.cn/20190715154848475.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTM1NTk5OQ==,size_16,color_FFFFFF,t_70)
![验证高可用(2)](https://img-blog.csdnimg.cn/20190715154939805.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTM1NTk5OQ==,size_16,color_FFFFFF,t_70)
- 杀死状态为
Active
的NameNode,此时是vm1上的NameNode。
使用虚拟机vm1执行下列命令
jps
17779 DFSZKFailoverController
17335 NameNode
15144 QuorumPeerMain
17609 JournalNode
18089 Jps
17439 DataNode
kill -9 17335
- 刷新
http://192.168.0.52:50070
,检查状态是否从standby
转为Active
。 - 如果以上步骤都没问题,则HDFS高可用集群搭建完毕,如果存在问题,请检查以下几点:
- 检查Zookeeper和Hadoop的配置文件是否正确配置、日志是否有错误输出;
- 检查jps命令显示的服务数是否正确;
- 检查是否正确的完成了
首次启动
中的操作说明。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)