目录
试想一个场景,每个hdfs集群只有一个namenode节点,如果这个namenode节点不可用,那么整个hdfs集群服务都不可用,这样集群的可抗性是非常差的。HDFS-HA(HDFS High Availability)就是解决集群单namenode节点的解决方案,可以在集群内设置多个namenode节点,多个namenode节点只有一个是活动(active)状态,其他namenode节点是后备(standby)状态,一旦活动的namenode节点不可用时,后备的namenode节点马上切换至活动状态,继续提供服务。
说明:三台机器的主机名是:bigdata.centos01、bigdata.centos02、bigdata.centos03,其中在01和02上面部署namenode节点服务,在三台机器上部署datanode和journalnode服务。
一、HDFS-HA配置和测试
说明:该配置是基于单namenode节点上做配置,如未配置好单namenode节点服务,请参阅:Hadoop集群搭建
1. 修改hdfs-site.xml
<!-- 新增如下配置项 -->
<!-- nameservice 的名称-->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!-- 配置每个namenode在nameservice的唯一标识,每个nameservice最多能配置两个 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!-- 配置RPC(远程过程调用)监听地址和端口 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>bigdata.centos01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>bigdata.centos02:8020</value>
</property>
<!-- 配置namenode http页面访问地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>bigdata.centos01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>bigdata.centos02:50070</value>
</property>
<!-- 设置一组 journalNode 的 URI 地址 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://bigdata.centos01:8485;bigdata.centos02:8485;bigdata.centos03:8485/ns</value>
</property>
<!-- journalNode日志存放目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/modules/hadoop-2.5.0/data/jn</value>
</property>
<!--故障代理-->
<property>
<name>dfs.client.failover.proxy.provider.ns</name
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--隔离机制,读者请配置自己的user,替换<current_user>-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/<current_user>/.ssh/id_rsa</value>
</property>
2. 修改core-site.xml
<!-- 将属性值修改为hdfs-site.xml中配置的nameservice名称 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
3. 服务启动
- 优先启动三台机器的journalnode,开始记录日志
# 三台机器执行
sbin/hadoop-daemon.sh start journalnode
- 选取部署两台机器中的一台进行格式化操作,并启动namenode,此处选择是centos01
# 格式化,如果未启动journalnode,会报错
bin/hdfs namenode -format
# 启动namenode
sbin/hadoop-daemon.sh start namenode
- centos01执行格式化操作,centos02复制centos01的格式化数据
bin/hdfs namenode -bootstrapStandby
- 重新启动所有服务
# 停止先前启动的namenode和journalnode
sbin/stop-dfs.sh
# 启动namenode、datanode、journalnode
sbin/start-dfs.sh
- 在浏览器访问namenode服务情况
http://bigdata.centos01:50070
http://bigdata.centos02:50070
- 更改其中一台standby状态为active状态
# 配置文件中配置了nn1和nn2,是namenode的唯一标识
bin/hdfs haadmin -transitionToActive nn1
二、自动故障转移
如前面内容所示,namenode节点状态需要手动来更改为active状态,而且我们并不能实现其中一个namenode节点故障,另一个namenode节点服务状态由standby切换至active状态。下面将基于zookeeper做namenode的自动故障转移。
如未配置好zookeeper集群,请参阅:zookeeper的配置和分布式部署
注意:两台配置namenode节点服务器必须要支持互相无秘钥登录。无秘钥登录请参阅:Hadoop ssh无秘钥登录
1. 修改hdfs-site.xml文件
增加如下配置项:
<!-- 是否启动自动故障转移,ns是配置文件配置的nameservice名称 -->
<property>
<name>dfs.ha.automatic-failover.enabled.ns</name>
<value>true</value>
</property>
2. 修改core-site.xml文件
增加如下配置项:
<!-- 配置zookeeper -->
<property>
<name>ha.zookeeper.quorum</name>
<value>bigdata.centos01:2181,bigdata.centos02:2181,bigdata.centos03:2181</value>
</property>
3. 服务启动
- 启动zookeeper
# 3台机器执行
bin/zkServer.sh start
- 初始化zookeeper
# 先停止hdfs的服务
sbin/stop-dfs.sh
# 只在一台部署namenode的节点上执行
bin/hdfs zkfc -formatZK
# 启动hdfs的服务
sbin/start-dfs.sh
- 启动zkfc,监控namenode状态
# 执行以下命令,会有DFSZKFailoverController进程
# 部署namenode节点机器都需要执行
/sbin/hadoop-daemon.sh start zkfc
- 结果
centos01通过zookeeper选举为active状态:
centos02是standby状态:
- 测试
通过停止centos01的namenode服务,以达到模拟centos01的namenode服务故障的目的,停止centos01的namenode后发现centos02的namenode的状态由standby转化为active状态。