Hadoop Ha的原理图:
Hadoop1.X 中NameNode是HDFS集群的单点故障,每一个集群只有一个NameNode,如果这个机器或进程不可用,整个集群就无法使用,直到重启NameNode或者新启动一个NameNode节点
影响HDFS集群不可用主要包括以下两种情况
- 类似机器宕机这样的意外情况将导致集群不可用,只有重启NameNode之后才可使用
- 计划内的软件或硬件升级,将导致集群在短时间范围内不可用。
Hadoop2.X的HDFS的高可用性(HA)就可以解决上述问题,通过提供选择运行在同一集群中的一个热备的“主/备”两个冗余NameNode,允许在机器宕机或系统维护的时候,快速转移到另一个NameNode。
架构解释如下只有一个NameNode是Active的,并且只有这个ActiveNameNode能提供服务,改变NameSpace。以后可以考虑让StandbyNameNode提供读服务。
提供手动Failover,在升级过程中,Failvoer在NameNode-DataNode之间写不变的情况下才能生效。
在之前的NameNode重新恢复之后,不能提供failback。
数据一致性比Failover更重要
尽量少用特殊的硬件
HA的设置和Failover都应该保证在两者操作错误或者配置错误的时候,不得导致数据损坏
NameNode的短期垃圾回收不应该触发Failover
DataNode会同时向NameNode Active和NameNode Standly汇报块的信息。NameNode Active和NameNode Standby通过NFS备份MetaData信息到一个磁盘上面。
设定有4太机器,分别为node1,node2,node3,node3
1. 配置机器如下:
NN | DN | JN | ZK | ZKFC | |
---|---|---|---|---|---|
node1 | 1 | 1 | 1 | ||
node2 | 1 | 1 | 1 | 1 | 1 |
node3 | 1 | 1 | 1 | ||
node4 | 1 | 1 |
2. 在hadoop集群配置的基础上hadoop的HDFS集群的搭建,需要做的改进:
1)在node1,node2上配置免密钥。
2)删除每台机器上面的masters文件(masters是设置SNN的,在Hadoop高可用中,没有SNN,而是提供两个NN)。
3) 修改配置文件,先在一台机器上修改,然后同步到其他的机器上:
hadoop-env.sh 中配置JAVA_HOME;
hdfs-site.xml和core-site.xml
注意:清空hadoop.tmp.dir的文件目录,每台机器都要做。
core-site.xml配置:
- <configuration>
- <property>
- <name>fs.defaultFS</name>
- <value>hdfs://ns1</value>
- </property>
- <property>
- <name>hadoop.tmp.dir</name>
- <value>/home/tmp/data</value>
- </property>
- <property>
- <name>ha.zookeeper.quorum</name>
- <value>node1:2181,node2:2181,node3:2181</value>
- </property>
- </configuration>
hdfs-site.xml配置:
- <configuration>
- <property>
- <name>dfs.nameservices</name>
- <value>ns1</value>
- </property>
- <property>
- <name>dfs.ha.namenodes.ns1</name>
- <value>nn1,nn2</value>
- </property>
- <!-- nn1的RPC通信地址,nn1所在地址 -->
- <property>
- <name>dfs.namenode.rpc-address.ns1.nn1</name>
- <value>node1:8020</value>
- </property>
- <!-- nn1的http通信地址,外部访问地址 -->
- <property>
- <name>dfs.namenode.http-address.ns1.nn1</name>
- <value>node1:50070</value>
- </property>
- <!-- nn2的RPC通信地址,nn2所在地址 -->
- <property>
- <name>dfs.namenode.rpc-address.ns1.nn2</name>
- <value>node2:8020</value>
- </property>
- <!-- nn2的http通信地址,外部访问地址 -->
- <property>
- <name>dfs.namenode.http-address.ns1.nn2</name>
- <value>node2:50070</value>
- </property>
- <!-- 指定NameNode的元数据在JournalNode日志上的存放位置(一般和zookeeper部署在一起) -->
- <property>
- <name>dfs.namenode.shared.edits.dir</name>
- <value>qjournal://node2:8485;node3:8485;node4:8485/ns1</value>
- </property>
- <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
- <property>
- <name>dfs.journalnode.edits.dir</name>
- <value>/opt/journal/data</value>
- </property>
- <!--客户端通过代理访问namenode,访问文件系统,HDFS 客户端与Active 节点通信的Java 类,使用其确定Active 节点是否活跃 -->
- <property>
- <name>dfs.client.failover.proxy.provider.ns1</name>
- <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
- </property>
- <!--这是配置自动切换的方法,有多种使用方法,具体可以看官网,在文末会给地址,这里是远程登录杀死的方法 -->
- <property>
- <name>dfs.ha.fencing.methods</name>
- <value>sshfence</value> ----这个参数的值可以有多种,你也可以换成shell(/bin/true)试试,也是可以的,这个脚本do nothing 返回0
- </property>
- <!-- 这个是使用sshfence隔离机制时才需要配置ssh免登陆 -->
- <property>
- <name>dfs.ha.fencing.ssh.private-key-files</name>
- <value>/root/.ssh/id_rsa</value>
- </property>
- <!-- 配置sshfence隔离机制超时时间,这个属性同上,如果你是用脚本的方法切换,这个应该是可以不配置的 -->
- <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>
- </configuration>
4)安装zookeeper并且配置环境变量ZOOKEEPER_HOME,把zoo_example.cfg重命名为zoo.cfg配置文件
默认配置如下图:
在文件结尾添加 zookeeper服务器的配置:
- server.1=node1:2888:3888
- server.2=node2:2888:3888
- server.3=node3:2888:3888
然后分别在node1,2,3dataDir目录下创建myid文件 。对应机器的myid里分别写入1, 2, 3
5)先启动JN,在node2,3,4上各自执行以下命令:
hadoop-daemon.sh start journalnode
6) 格式化namenode,在node1上执行格式化操作:
hdfs namenode -format
格式化后必须启动node1,否则NN2进行格式化会报错
hadoop-ademon.sh start namenode
7) 在另外一个namenode上同步格式化,node2上执行如下命令:
hdfs namenode -bootstrapStandby
8)启动zookeeper集群,分别在node1,2,3上执行如下命令:
zkServer.sh start
9)格式化zk,在node1上执行(必须在NN上执行)。如下命令:
hdfs zkfc -formatZK
10) 启动集群 start-dfs.sh
11) 访问页面 http://node1:50070 http://node2:50070
发现node1是active状态,node2是standby状态。