配置

HA即高可用集群 (Hight Ability) 的意思. 默认情况下不开启,需要手动配置。

修改 core-site.xml:

set fs.defaultFS=hdfs://<集群名字> # 这里的集群名字是逻辑上的集群名字
# zookeeper
set ha.zookeeper.quorum=master:2181,slave2:2181,slave3:2181

修改hdfs-stie.xml。(注意在 HA中,我们不再需要 SecondaryNN, 而是通过两个 NN 的主备切换来形成高可用 )

set dfs.nameservices=<上面写的集群名字>
set dfs.ha.namenodes.<集群名字>=<NN name 1>,<NN name 2> # ( 一个HA中只能有2个 NN, 用逗号隔开 )

# 循环配置 两个 NN 节点
set dfs.namenode.rpc-address.<集群名字>.<NN name 1>=master:9820
set dfs.namenode.http-address.<集群名字>.<NN name 1>=master:50070

# 定义journalNode,奇数, 至少3个, 用于记录操作记录,同步文件系统的元数据信息
set dfs.namenode.shared.edits.dir=qjournal://master:8485;slave2:8485;slave3:8485/<集群名字>
set dfs.journalnode.edits.dir=/opt/tmp/qjournal  # 用于存放数据文件

# 故障转移配置
set dfs.ha.automatic-failover.enabled.<集群名字>=true
set dfs.client.failover.proxy.provider.<集群名字>=org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
set dfs.ha.fencing.methods=sshfence  # 切换的方法为通过 ssh 远程kill
# 注意这里需要保持两台NN的 id_rsa 一致
set dfs.ha.fencing.ssh.private-key-files=/home/hadoop/.ssh/id_rsa 

配置完成同步所有机器,之后按以下顺序执行

zkServer.sh start # 所有的 zookeeper 节点上运行
hdfs zkfc -formatZK # 在NN1上执行,在zk中创建存放集群信息的目录
hadoop-daemon.sh start journalnode # 在集群上所有配置了journalNode的节点上运行
hadoop-daemon.sh start zkfc # 在两台NN上执行, 启动守护进程,用于检测 hdfs nn状态

########## 这里分两种情况

##### 对一个全新的集群, 可以直接格式化 namenode
# 在 NN1 上执行
hdfs namenode -format <集群名字> # y y  
hadoop-daemon.sh start namenode

# 在 NN2 上执行
hdfs namenode -bootstrapStandby
hadoop-daemon.sh start namenode

# 在 NN1 上执行
start-dfs.sh # 在某台NN上执行

##### 在将一个非HA NameNode转换成HA NameNode
# 在原有的 NN 机器上执行
hdfs namenode -initializeSharedEdits # 使用本地NameNode的edits数据来初始化JournalNodes, 此时会提示格式化 QJM
hadoop-daemon.sh start namenode  # 重新启动 namenode
# 切换到新的 NN 上执行
hdfs namenode -bootstrapStandby
hadoop-daemon.sh start namenode
# 依次重启datanode, 由于 datanode 此时未启用最新的 hdfs-site 配置, 所以并不会向 standby nn 上报块, 重启之后解决

全部启动完成之后,此时访问 NN1:50070 可以看到状态为 active, 访问NN2:50070状态为 standby

在NN1上执行 kill <namenode pid>,然后可以看到 NN2:50070 的状态变为 active,则 hdfs ha配置成功

指令

hdfs 提供了 haadmin 工具供我们使用

hdfs haadmin <commands>

- transitionToActive / transitionToStandby # 转换指定NameNode 的状态,Acitve或者Standby
- failover	# 在两个NameNode 之间启动一次故障转移
- getServiceState	# 查看指定NameNode 的状态,Acitve或者Standby
- getAllServiceState	# 查看所有NameNode 的状态,Acitve或者Standby
- checkHealth	# 检查指定NameNode 的健康状态

Tips

如果是由单点 namenode 升级为 ha namenode , 对于一些服务, 需要修改它们引用的 hdfs 路径

举例如 hive 表. location 指定的是原来的单点 namenode, 此时就需要执行如下语句修改表的 location

alter table tstloc set location 'hdfs:///tmp/ttslocnew';