目录
一、相关进程
1.QuorumPeerMain
:
zookeeper
服务组件对应的进程
2.JournalNode
:
qjm
对应的守护进程
3.DFSZKFailoverController
:
zookeeper
对应的⾃动容灾客户端进程,运⾏在 、Namenode节点上
4.NameNode:
5.ZookeeperMain:
⼿动连接
zookeeper
服务所产⽣的客户端进
二、HA的配置
环境准备:
1). 三台虚拟机:hadoop01,hadoop02,hadoop03
2).
保证三台机器的防⽕墙都是关闭状态
3).
保证三台机器的免密登陆认证
4).
保证三台机器的时间同步
5).
保证三台机器的
/etc/hosts
⽂件的域名映射关系配置
6).
保证三台机器安装了
jdk
和
hadoop
,并且配置了环境变量且命令好使
2.1修改hdfs-site.xml⾥
<!--配置名称服务的逻辑名称-->
<property>
<name>dfs.nameservices</name>
<value>supercluster</value>
</property>
<!--配置两个namenode的唯⼀标识符-->
<property>
<name>dfs.ha.namenodes.supercluster</name>
<value>nn1,nn2</value>
</property>
<!--针对于每⼀个唯⼀标识符的namenode,设置完整的rpc地址和端⼝-->
<property>
<name>dfs.namenode.rpc-address.supercluster.nn1</name>
<value>hadoop01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.supercluster.nn2</name>
<value>hadoop02:8020</value>
</property>
<!--针对于每⼀个唯⼀标识符的namenode,配置http协议的地址和端⼝-->
<property>
<name>dfs.namenode.http-address.supercluster.nn1</name>
<value>hadoop01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.supercluster.nn2</name>
<value>hadoop02:50070</value>
</property>
<!--配置journalnode的服务器地址和存储⽬录(数⽬为奇数个)-->
<!-- 服务器地址使⽤分号“;”作为分隔符-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/journalData</value>
</property>
<!--指定客户端连接Active的namenode节点的java类型-->
<property>
<name>dfs.client.failover.proxy.provider.supercluster</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>
<!--为了使该防护选项起作⽤,它必须能够在不提供密码的情况下SSH到⽬标节点。因此,还必须配置以下属性-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 免密登陆超时时间,超过此时间未连接上,则登陆失败,此配置可选-->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!--修改⽀持⾃动容灾属性-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--将原来全分布式下⾯的配置去掉-->
<!-- secondarynamenode守护进程的http地址:主机名和端⼝号。参考守护进程布局-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave1:50090</value>
</property>
<!-- namenode守护进程的http地址:主机名和端⼝号。参考守护进程布局-->
<property>
<name>dfs.namenode.http-address</name>
<value>master:50070</value>
</property>
2.2在core-site.xml⽂件⾥修改部分属性
1)修改fs.defaultFS的属性值为名称服务的逻辑名称
<!--注意:是修改,修改,修改原属性的值不是追加,亲-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://supercluster</value>
</property>
2) 定义journalnode进程的数据存储的⽗路径(⽬录在上⾯已经定义好了 的:journalData)
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
3) 添加zookeeper服务器
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
2.3 将配置信息分发到其他节点上
[root@hadoop01~] # scp /opt/apps/hadoop/etc/hadoop/* hadoop02:/opt/apps/hadoop/etc/hadoop/[root@hadoop01~] # scp /opt/apps/hadoop/etc/hadoop/* hadoop03:/opt/apps/hadoop/etc/hadoop/
三、HA的启动
HA
的第⼀次启动,有以下两种情况:
1、当普通集群已经使⽤⼀段时间后,再转为
HA
,此时,已经存在
fsimage
⽂件了。
2、在搭建完全分布式时,直接搭建
hdfs
的
HA
,此时,还没有⽣成
fsimage
⽂件
3.1 第⼀种情况:集群使⽤⼀段时间后,转为HA.
1
.
启动三个节点上的
journalnode
服务,(请注意,如果集群启动了,先把集群 stop掉)
[root@hadoop01~] # hadoop-daemon.sh start journalnode[root@hadoop02~] # hadoop-daemon.sh start journalnode[root@hadoop03~] # hadoop-daemon.sh start journalnode
2
.
启动以前节点上的
namenode
进程
[root@hadoop01~] # hadoop-daemon.sh start namenode
3
.
在新的
namenode
节点上拉取镜像⽂件
[root@hadoop01~] # hdfs namenode -bootstrapStandby
4
.
同步⽇志到
journalnode
集群上
,
再启动集群
--
先关
namenode
[root@hadoop01~] # hadoop-daemon.sh stop namenode
--
再同步⽇志
[root@hadoop01~] # hdfs namenode -initializeSharedEdits
5
.
格式化
zkfc
-
1
、前提
QuorumPeerMain
服务必须处于开启状态,客户端
zkfc
才能格式化成功
[root@hadoop01~] # zkServer.sh start[root@hadoop02~] # zkServer.sh start[root@hadoop03~] # zkServer.sh start
-
2
、选择其中⼀个
namenode
节点进⾏格式化
zkfc
[root@hadoop01~] # hdfs zkfc -formatZK
6
.
你就可以快乐的开启
HA
集群进⾏测试了
[root@hadoop01~]# start-all.sh
3.2第⼆种情况:搭建集群时,直接搭建HA
1
.
启动三个节点上的
journalnode
服务
[root@hadoop01~] # hadoop-daemon.sh start journalnode[root@hadoop02~] # hadoop-daemon.sh start journalnode[root@hadoop03~] # hadoop-daemon.sh start journalnode
2
.
格式化
namenode
-
先删除所有节点的
${hadoop.tmp.dir}
/tmp/
的数据
(
可选,这⼀步表示弃⽤ fsimage.)
-
选择其中⼀个
namenode
进⾏格式化
[root@hadoop01~] # hdfs namenode -format
-
并启动
namenode
进程
[root@hadoop01~] # hadoop-daemon.sh start namenode
3
.
在另⼀台
namenode
上拉取已格式化的那台机器的镜像⽂件(数据的⼀致性)
[root@hadoop02~] # hdfs namenode -bootstrapStandby
4
.
然后关闭已经启动的
namenode
[root@hadoop01~] # hadoop-daemon.sh stop namenode
5
.
格式化
zkfc
-
1
、前提
QuorumPeerMain
服务必须处于开启状态,客户端
zkfc
才能格式化成 功
[root@hadoop01~] # zkServer.sh start[root@hadoop02~] # zkServer.sh start[root@hadoop03~] # zkServer.sh start
-
2
、选择其中⼀个
namenode
节点进⾏格式化
zkfc
[root@hadoop01~] # hdfs zkfc -formatZK
6
.
你就可以快乐的开启
HA
集群进⾏测试了
[root@hadoop01~] # start-all.sh
注意:以后开
HA
集群时,要先开
zookeeper
服务,再开
HDFS
。