HA高可用集群安装部署
三个节点及以上
OS:64位RHEL5及以上或者64位CentOS7.0及以上
JVM:预装64位JDK 1.8及以上版本
Firefox 39.0.0版本及以上或者Google Chrome 54.0.2840.8版本及以上。
准备三个节点的虚拟机
在各个节点执行以下操作来修改主机名,使集群下的主机有格式一个统一的主机名,以便后续的操作和维护。
修改主机名(便于后续操作)
hostnamectl set-hostname ‘ha001’
hostnamectl set-hostname ‘ha002’
hostnamectl set-hostname ‘ha003’
192.168.20.111 ha001 作为namenode的active节点
192.168.20.112 ha002 作为namenode的standby节点
192.168.20.113 ha003 作为datanode节点
修改host映射
vi /etc/hosts
添加集群映射
192.168.20.111 ha001
192.168.20.112 ha002
192.168.20.113 ha003
systemctl stop firewalld
systemctl disable firewalld
yum –y install ntpdate
ntpdate pool.ntp.org
先删除原来配置的免密(三台)
rm -rf /root/.ssh
重新配置免密登录
ssh-keygen
ssh-copy-id ha001
ssh-copy-id ha002
ssh-copy-id ha003
记得给自己和其它两台都要同时发
参照本专栏前面的Hadoop详细集群搭建一文(记得配置环境变量)
参照本专栏前面的Zookeeper实战技能一文
之前已经安装的记得修改/usr/local/zookeeper-3.4.6/conf/下的zoo.cfg文件:
(因为主机名修改,映射也要修改)
然后启动Zookeeper
在ha001、ha002、ha003下都要执行
cd /usr/local/zookeeper-3.4.6/
bin/zkServer.sh start
bin/zkServer.sh status
出现lead,fllower,fllower为正常
注意:先把Hadoop集群正常模式配置一遍,先正常启动后,在
去配制高可用
Hadoop部分的配置分为两部分HDFS和YARN
1.修改配置文件
修改core-site.xml
vi core-site.xml
修改为以下内容:
<configuration>
<!-- 指定hdfs的nameservice为beh -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://beh
<final>false</final>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-2.7.3/tmp</value>
<final>false</final>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>ha001:2181,ha002:2181,ha003:2181</value>
<final>false</final>
</property>
</configuration>
修改hdfs-site.xml
vi hdfs-site.xml
修改为以下内容:
<configuration>
<!--指定hdfs的nameservice为beh,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>beh</value>
<final>false</final>
</property>
<!-- beh下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.beh</name>
<value>nn1,nn2</value>
<final>false</final>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.beh.nn1</name>
<value>ha001:9000</value>
<final>false</final>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.beh.nn1</name>
<value>ha001:50070</value>
<final>false</final>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.beh.nn2</name>
<value>ha002:9000</value>
<final>false</final>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.beh.nn2</name>
<value>ha002:50070</value>
<final>false</final>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name> <value>qjournal://ha001:8485;ha002:8485;ha003:8485/beh
<final>false</final>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop-2.7.3/journalData</value>
<final>false</final>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled.beh</name>
<value>true</value>
<final>false</final>
</property>
<!-- 配置失败自动切换实现方式 -->
<property> <name>dfs.client.failover.proxy.provider.beh</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
<final>false</final>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence
shell(/bin/true)
</value>
<final>false</final>
</property>
<!-- 获取私钥 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/usr/local/.ssh/id_rsa</value>
<final>true</final>
</property>
<!-- 指定副本数-->
<property>
<name>dfs.replication</name>
<value>3</value>
<final>false</final>
</property>
<configuration>
修改slaves
vi slaves
修改为以下内容:
ha003
修改mapred-site.xml
vi mapred-site.xml
修改为以下内容:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
修改yarn-site.xml
vi yarn-site.xml
修改为以下内容:
<!-- ha003作为nodemanger -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 开启RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 开启RM失败自动切换 -->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>beh</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>ha001</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>ha002</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>ha001:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>ha002:8088</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>ha001:2181,ha002:2181,ha003:2181</value>
</property>
修改环境变量
vi hadoop-env.sh
vi yarn-env.sh
修改为以下内容:
export JAVA_HOME=/usr/local/jdk1.8.0_102
scp -r /usr/local/hadoop-2.7.3 ha002:/usr/local
scp -r /usr/local/hadoop-2.7.3 ha003:/usr/local
注:将以上配置复制到所有节点
第一步:删除原来的元数据跟真实数据(在三台同时进行)
rm -rf /usr/local/hadoop-2.7.3/data
第二步:zookeeper重新启动(ha001、ha002、ha003三台全操作)
cd /usr/local/zookeeper-3.4.6/
bin/zkServer.sh start
bin/zkServer.sh status
出现leader,fllower,fllower为正常
第三部:主节点上启动整个集群 (只在 ha001操作)
start-all.sh
第四步:先启动QJM,(ha001、ha002、ha003三台全操作)
hadoop-daemon.sh start journalnode
第五步:格式化zookeeper,在ha01上执行(只执行一次)
hdfs zkfc -formatZK
第六步:对ha01节点进行格式化和启动启动namenode(进程名:NameNode)
hdfs namenode -format (只执行一次)
hadoop-daemon.sh start namenode
第七步:对ha02节点进行格式化和启动
hdfs namenode -bootstrapStandby (只执行一次)
hadoop-daemon.sh start namenode
第八步:启动zookeeper的监控节点(再01和02上执行)
hadoop-daemon.sh start zkfc
第九步:启动datanode (在ha03启动)
hadoop-daemon.sh start datanode
最后去验证HDFS高可用集群:
打开浏览器,访问 ha001:50070 以及 ha002:50070,你将会看到两个namenode一个是active而另一个是standby。
然后kill掉其中active的namenode进程,另一个standby的naemnode将会自动转换为active状态
192.168.20.111:50070
192.168.20.112:50070
然后我们把active状态的ha001结束,看它是否自动用ha002顶替位置
ha001宕机!!!
但ha002成功上位,变为active!!!
此时说明高可用集群搭建成功!!!
文末附上该高可用集群的启动命令与停止命令(也可以根据这些命令整合编写一脚本):
启动高可用集群
zkServer.sh start (ha001、ha002、ha003执行)
hadoop-daemon.sh start journalnode (ha001、ha002、ha003执行)
hadoop-daemon.sh start namenode (ha001、ha002执行)
hadoop-daemon.sh start zkfc (ha001、ha002执行)
hadoop-daemon.sh start datanode (ha003执行)
start-yarn.sh (ha001执行)
yarn-daemon.sh start resourcemanager (ha002执行)
停止高可用集群
zkServer.sh stop (ha001、ha002、ha003执行)
hadoop-daemon.sh stop journalnode (ha001、ha002、ha003执行)
hadoop-daemon.sh stop namenode (ha001、ha002执行)
hadoop-daemon.sh stop zkfc (ha001、ha002执行)
hadoop-daemon.sh stop datanode (ha003执行)