HDFS HA 需要 设置静态IP、安装 jdk、设置ssh无密码登录、安装zookeeper、安装hadoop。
在Hadoop2.X之前,Namenode是HDFS集群中可能发生单点故障的节点,每个HDFS集群只有一个namenode,一旦这个节点不可用,则整个HDFS集群将处于不可用状态。
HDFS高可用(HA)方案就是为了解决上述问题而产生的,在HA HDFS集群中会同时运行两个Namenode,一个作为活动的Namenode(Active),一个作为备份的Namenode(Standby)。备份的Namenode的命名空间与活动的Namenode是实时同步的,所以当活动的Namenode发生故障而停止服务时,备份Namenode可以立即切换为活动状态,而不影响HDFS集群服务。
下面是大家过程,我将整个过程分步详细整理了,这样能够更详细的展示。
服务器名称 | 进程 |
hadoop01 | QuorumPeerMain、NameNode、DataNode、JournalNode、ResourceManager、NodeManager、DFSZKFailoverController、 |
hadoop02 | QuorumPeerMain、NameNode、DataNode、JournalNode、DFSZKFailoverController 、NodeManager |
hadoop03 | QuorumPeerMain、DataNode、JournalNode、NodeManager |
1、设置静态IP
2、安装jdk
3、设置ssh无密码登录
普通hdfs集群实现链接里面的一台虚拟机(master即namenode所在机器)无密码登录其他虚拟机就可以,
搭建HA高可用需要其他的namenode所在机器也能够无密码登录其他虚拟机,所以要在另一台namenode上都重复下面的操作
4、安装zookeeper
1)新建zookeeper安装目录
[hadoop@hadoop01 app]$ mkdir zookeeper
2)将下载的安装包上传至目录下并解压
[hadoop@hadoop01 zookeeper]$ tar -zxvf apache-zookeeper-3.5.5-bin.tar.gz
3)修该解压后的目录便于使用
[hadoop@hadoop01 zookeeper]$ mv apache-zookeeper-3.5.5-bin zookeeper3.5
4)在当前目录新建zkdata目录
[hadoop@hadoop01 zookeeper]$ mkdir zkdata
5)在zkdata目录新建myid文件并输入数据1
[hadoop@hadoop01 zkdata]$ vi myid
6)复制配置文件zoo_sample.cfg为zoo.cfg并编辑
[hadoop@hadoop01 conf]$ cp zoo_sample.cfg zoo.cfg
[hadoop@hadoop01 conf]$ vi zoo.cfg
修改其中dataDir路径为zhdata并添加server
dataDir=/home/app/zookeeper/zkdata
server.1=192.168.146.210:2888:3888
server.2=192.168.146.211:2888:3888
server.3=192.168.146.212:2888:3888
上述三个server地址即三台虚拟机ip,第一个端口2888为QuorumPeerMain服务端口,3888端口为leader选举端口。
7)将整个zookeeper文件加scp到其他两台虚拟机同样位置,并分别修改myid文件内容为2,3
[hadoop@hadoop01 app]$scp -r zookeeper/ hadoop@hadoop02:/home/hadoop/app/hdfs/zookeeper/
8)因为三台虚拟机的zookeeper都需要启动,为了方便我们写在bin目录下一个启动三台虚拟机的shell脚本start-ZK.sh
[hadoop@hadoop01 bin]$ vi start-ZK.sh
#!/bin/bash
echo "Starting zkServer ..."
hostname="hadoop01 hadoop02 hadoop03" #虚拟机名写自己的
for name in $hostname
do
ssh $name "source /etc/profile; /home/app/zookeeper/zookeeper3.5/bin/zkServer.sh start" #目录修改为自己的
done
9)在bin目录下执行start-ZK.sh脚本,启动zookeeper集群
[hadoop@hadoop01 bin]$ sh start-ZK.sh
使用jps查看启动状态:
[hadoop@hadoop01 bin]$ jps
三台机器均启动成功,zookeeper安装配置完毕。
5、安装hadoop
1、解压hadoop-2.7.7.tar.gz
1)将下载的hadoop-2.7.7.tar.gz上传至/home/hadoop 目录
2)解压
[hadoop@hadoop01 ~]$ tar -zxvf hadoop-2.7.7.tar.gz
解压完成:
3)使用 root 用户配置 hadoop 环境变量(三台机器都要配置)
[root@hadoop01 hadoop2.7]# vi /etc/profile
使配置生效
[root@hadoop01 hadoop]# source /etc/profile
4)配置hosts映射(三台机器都要配置)
[root@hadoop01 hadoop2.7]# vi /etc/hosts
2、配置 hadoop 文件中相应的文件
这里使用的是hadoop用户
需要配置的文件如下,core-site.xml、hadoop-env.sh、hdfs-site.xml、mapred-site.xml、yarn-site.xml 所有的文件配置均位于hadoop2.7.1/etc/hadoop下面,具体需要的配置如下:
1) 配置core-site.xml
[hadoop@hadoop01 hadoop]$ vi core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hf</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/app/hdfs/hadoop/hadoop-2.7.7/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
</configuration>
在/home/hadoop/app/hdfs/hadoop/hadoop-2.7.7/ 目录下新建文件夹tmp
注意:hadoop.tmp.dir是hadoop 文件系统依赖的配置文件。 默认是在 /tmp 目录下的,而这个目录下的文件,在Linux系统中,重启之后,很多都会被清空。所以我们要手动指定这写文件的保存目录。
这个目录路径要么不存在,hadoop启动的时候会自动帮我们创建;要么是一个空目录,不然在启动的时候会报错。
2)配置hadoop-env.sh
[hadoop@hadoop01 hadoop]$ vi hadoop-env.sh
设置 JAVA_HOME 为自己在系统中安装的 JDK 目录
3)配置hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/app/hdfs/hadoop/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/app/hdfs/hadoop/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop02:50090</value>
</property>
-->
<!--指定hdfs的虚拟服务名-->
<property>
<name>dfs.nameservices</name>
<value>hf</value>
</property>
<!--指定hdfs的虚拟服务名下的namenode-->
<property>
<name>dfs.ha.namenodes.hf</name>
<value>namenode01,namenode02</value>
</property>
<!--指定namenode的内部通信地址-->
<property>
<name>dfs.namenode.rpc-address.hf.namenode1</name>
<value>hadoop01:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hf.namenode2</name>
<value>hadoop02:9000</value>
</property>
<!--指定namenode的web ui通信地址-->
<property>
<name>dfs.namenode.http-address.hf.namenode1</name>
<value>hadoop01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.hf.namenode2</name>
<value>hadoop02:50070</value>
</property>
<!--指定journalnode数据共享目录-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/hf</value>
</property>
<!--存放journalnode本地存放目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/app/hdfs/hadoop/journaldata</value>
</property>
<!--开启namenode失败是否自动切换-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--指定namanode失败进行自动切换的主类-->
<property>
<name>dfs.client.failover.proxy.provider.hf</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--指定脑裂时,采用某种方式杀死期中一个-->
<!--防止多个namenode,同active(脑裂)-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
4)配置mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value>
</property>
</configuration>
5)配置yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoop01:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop01:8030</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoop01:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>hadoop01:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hadoop01:8088</value>
</property>
<!-- 开启RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</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>hadoop01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop02</value>
</property>
<!-- 分别指定RM的网络通信地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop01:8088</value>
</property>
<!-- 分别指定RM的网络通信地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop02:8088</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
</configuration>
6)配置/etc/hadoop目录下的slaves,删除默认的localhost,增加3个从节点
[hadoop@hadoop01 hadoop]$ vi slaves
3、将配置好的 hadoop 文件上传给其它两台机器
[hadoop@hadoop01 hadoop]$ scp -r hadoop-2.7.7/ hadoop@hadoop03:/home/hadoop/app/hdfs/hadoop
[hadoop@hadoop01 hadoop]$ scp -r hadoop-2.7.7/ hadoop@hadoop02:/home/hadoop/app/hdfs/hadoop
4、启动 hadoop
1)启动zk(三台)
因为没有配置zookeeper得环境变量,我把之前写的zookeeper得启动脚本放在hadoop启动脚本目录中,方便一起启用:
需要修改脚本权限为 755
[hadoop@hadoop01 bin]$ cp start-ZK.sh /home/hadoop/app/hdfs/hadoop/hadoop-2.7.7/sbin/start-ZK.sh
[hadoop@hadoop01 sbin]$ chmod 755 start-ZK.sh
启动zookeeper
[hadoop@hadoop01 bin]$ start-ZK.sh
jps查看进程
[root@hadoop01 bin]# jps
2)启动journalnode服务(三台)
[hadoop@hadoop01 bin]$ hadoop-daemon.sh start journalnode
jps查看
3)挑选两个namenode之中的一台来格式化
[hadoop@hadoop01 hadoop]$ hdfs namenode -format
4)然后启动namenode
[hadoop@hadoop01 hadoop]$ hadoop-daemon.sh start namenode
5)在另一台namenode的机子上拉取元数据
[hadoop@hadoop02 hadoop]$ hdfs namenode -bootstrapStandby
6)格式化zkfc(在两个namenode节点)
[hadoop@hadoop01 hadoop]$ hdfs zkfc -formatZK
7)启动集群
[hadoop@hadoop01 hadoop]$ start-all.sh
jps查看
完成安装!!!
注: 以后启动只需要执行start-ZK.sh 和 start-all.sh 即可!!!