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

高可用分布式架构 分布式高可用方案_zookeeper安装_02


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选举端口。

高可用分布式架构 分布式高可用方案_hdfs HA_03


7)将整个zookeeper文件加scp到其他两台虚拟机同样位置,并分别修改myid文件内容为2,3

[hadoop@hadoop01 app]$scp -r zookeeper/ hadoop@hadoop02:/home/hadoop/app/hdfs/zookeeper/

高可用分布式架构 分布式高可用方案_hdfs HA_04


高可用分布式架构 分布式高可用方案_ssh无密码登录_05


高可用分布式架构 分布式高可用方案_ssh无密码登录_06


8)因为三台虚拟机的zookeeper都需要启动,为了方便我们写在bin目录下一个启动三台虚拟机的shell脚本start-ZK.sh

[hadoop@hadoop01 bin]$ vi start-ZK.sh

高可用分布式架构 分布式高可用方案_高可用分布式架构_07

#!/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

高可用分布式架构 分布式高可用方案_hdfs HA_08


9)在bin目录下执行start-ZK.sh脚本,启动zookeeper集群

[hadoop@hadoop01 bin]$ sh start-ZK.sh

高可用分布式架构 分布式高可用方案_ssh无密码登录_09


使用jps查看启动状态:

[hadoop@hadoop01 bin]$ jps

高可用分布式架构 分布式高可用方案_高可用分布式架构_10


三台机器均启动成功,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

解压完成:

高可用分布式架构 分布式高可用方案_高可用分布式架构_11


3)使用 root 用户配置 hadoop 环境变量(三台机器都要配置)

[root@hadoop01 hadoop2.7]# vi /etc/profile

高可用分布式架构 分布式高可用方案_hdfs HA_12


使配置生效

[root@hadoop01 hadoop]# source /etc/profile

高可用分布式架构 分布式高可用方案_高可用分布式架构_13

4)配置hosts映射(三台机器都要配置)

[root@hadoop01 hadoop2.7]# vi /etc/hosts

高可用分布式架构 分布式高可用方案_zookeeper安装_14

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>

高可用分布式架构 分布式高可用方案_高可用分布式架构_15


在/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 目录

高可用分布式架构 分布式高可用方案_ssh无密码登录_16


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

高可用分布式架构 分布式高可用方案_ssh无密码登录_17

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

高可用分布式架构 分布式高可用方案_高可用分布式架构_18


启动zookeeper

[hadoop@hadoop01 bin]$ start-ZK.sh

高可用分布式架构 分布式高可用方案_zookeeper安装_19


jps查看进程

[root@hadoop01 bin]# jps

高可用分布式架构 分布式高可用方案_高可用hdfs_20

2)启动journalnode服务(三台)

[hadoop@hadoop01 bin]$ hadoop-daemon.sh start journalnode

jps查看

高可用分布式架构 分布式高可用方案_zookeeper安装_21

3)挑选两个namenode之中的一台来格式化

[hadoop@hadoop01 hadoop]$ hdfs namenode -format

高可用分布式架构 分布式高可用方案_高可用hdfs_22

4)然后启动namenode

[hadoop@hadoop01 hadoop]$ hadoop-daemon.sh start namenode

高可用分布式架构 分布式高可用方案_hdfs HA_23

5)在另一台namenode的机子上拉取元数据

[hadoop@hadoop02 hadoop]$ hdfs namenode -bootstrapStandby

高可用分布式架构 分布式高可用方案_高可用分布式架构_24


6)格式化zkfc(在两个namenode节点)

[hadoop@hadoop01 hadoop]$ hdfs zkfc -formatZK

高可用分布式架构 分布式高可用方案_高可用分布式架构_25


7)启动集群

[hadoop@hadoop01 hadoop]$ start-all.sh

高可用分布式架构 分布式高可用方案_hdfs HA_26


jps查看

高可用分布式架构 分布式高可用方案_高可用hdfs_27


完成安装!!!

注: 以后启动只需要执行start-ZK.sh 和 start-all.sh 即可!!!