HDFS HA 高可用集群搭建
主要内容
1.安装并配置Zookeeper集群
参考:https://blog.youkuaiyun.com/amingo_ss/article/details/104326593
2.配置HDFS(hdfs-site.xml)
== 注意要将修改后的hdfs-site.xml分发到集群各个机器。==
rsync -rvl /usr/local/hadoop/etc/hadoop/* hadoop@hadoop103:/usr/local/hadoop/etc/hadoop
rsync -rvl /usr/local/hadoop/etc/hadoop/* hadoop@hadoop104:/usr/local/hadoop/etc/hadoop
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/data/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/data/dfs/data</value>
</property>
<!-- 指定NameService的名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 指定NameService下两个NameNode的名称 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 分别指定NameNode的RPC通讯地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>192.168.1.80:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>192.168.1.81:8020</value>
</property>
<!-- 分别指定NameNode的Web监控页面地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>192.168.1.80:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>192.168.1.81:50070</value>
</property>
<!-- 指定NameNode编辑日志存储在JournalNode集群中的目录-->
<property>
<name>dfs.namenode.shared.edits.dir</name> <value>qjournal://192.168.1.80:8485;192.168.1.81:8485;192.168.1.82:8485/mycluster</value>
</property>
<!-- 指定JournalNode集群存放日志的目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop/journalnode</value>
</property>
<!-- 配置NameNode失败自动切换的方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 由于使用SSH,那么需要指定密钥的位置-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 开启失败故障自动转移-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置Zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>192.168.1.80:2181,192.168.1.81:2181,192.168.1.82:2181</value>
</property>
<!-- 文件在HDFS中的备份数(小于等于NameNode) -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 关闭HDFS的访问权限 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
</configuration>
*指定NameNode的RPC通讯地址是为了接收FailoverControllerActive和FailoverControllerStandBy以及DataNode发送的心跳。
3.配置Hadoop公共属性(core-site.xml)
== 注意要将修改后的hdfs-site.xml分发到集群各个机器。==
<configuration>
<!-- Hadoop工作目录,用于存放Hadoop运行时NameNode、DataNode产生的数据 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/data</value>
</property>
<!-- 默认NameNode,使用NameService的名称 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 开启Hadoop的回收站机制,当删除HDFS中的文件时,文件将会被移动到回收站(/usr/<username>/.Trash),在指定的时间过后再对其进行删除,此机制可以防止文件被误删除 -->
<property>
<name>fs.trash.interval</name>
<!-- 单位是分钟 -->
<value>1440</value>
</property> </configuration>
*在HDFS HA集群中,StandBy的NameNode会对namespace进行checkpoint操作,因此就不需要在HA集群中运行Secondary NameNode。
4.启动HDFS HA高可用集群
1.分别启动JournalNode
2.格式化第一个NameNode并启动
3.第二个NameNode同步第一个NameNode的信息
4.启动第二个NameNode
5.启动Zookeeper集群
6.格式化Zookeeper
*当格式化ZK后,ZK中将会多了hadoop-ha节点。
7.重启HDFS集群
查看启动进程:
Namenode1
Namenode2:
当HDFS HA集群启动完毕后,可以分别访问NameNode管理页面查看当前NameNode的状态,http://192.168.1.80:50070、http://192.168.1.81:50070。
*可以查看到主机名为hadoop1的NamNode其状态为StandBy,而主机名为hadoop2的NameNode其状态为Active。
5.测试NameNode HA自动切换
1.手动杀死activity状态的namenode
此时访问NameNode管理页面,可见主机名为hadoop1的NameNode其状态从原本的StandBy切换成Active。
6.常见问题
1.namnode启动失败
Incompatible namespaceID for journal Storage Directory /home/hadoop/journalnode/mycluster: NameNode has nsId 563678262 but storage has nsId 1931684053
原因:namenode的namespaceid和journalnode的namespaceid不一致导致。
解决办法:
将hadoop/data下的数据清掉,重新格式化namenode。然后启动journalnode,再重新格式化namenode。确保namenode 里面的namespaceID和clusterID与journalnode中的一致。
Namenode:
Journalnode:
2.当activity状态的nameNode被杀死后,standby状态的namenode不会自动切换为activity状态。
查看zkfc的日志,报如下信息:
com.jcraft.jsch.JSchException: Algorithm negotiation fail
分析原因:服务器的openssh版本与hadoop的jsch jar版本不匹配。
解决办法:下载最新的jsch jar包替换hadoop下面几个文件夹中的jsch jar包。
hadoop的jsch jar包在share/hadoop文件下的:common,httpfs,kms,tools 文件夹中,路径如下:
hadoop/share/hadoop/common/lib
hadoop/share/hadoop/httpfs/tomcat/webapps/webhdfs/WEB-INF/lib
hadoop/share/hadoop/kms/tomcat/webapps/kms/WEB-INF/lib
hadoop/share/hadoop/tools/lib
查看当前系统的openssh版本信息:
openssh version