Hadoop Ha的原理图:

hdfs clinet 高可用 hadoop高可用_hdfs

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配置:

  

1. <configuration>  
2. <property>  
3.     <name>fs.defaultFS</name>  
4. //ns1</value>  
5. </property>  
6. <property>  
7.     <name>hadoop.tmp.dir</name>  
8. </value>  
9. </property>  
10. <property>  
11.     <name>ha.zookeeper.quorum</name>  
12. :2181,node2:2181,node3:2181</value>  
13. </property>  
14. </configuration>  
 
   hdfs-site.xml配置:
1. <configuration>  
2. <property>  
3.     <name>dfs.nameservices</name>  
4.     <value>ns1</value>  
5. </property>  
6. <property>  
7.     <name>dfs.ha.namenodes.ns1</name>  
8.     <value>nn1,nn2</value>  
9. </property>  
10. <!-- nn1的RPC通信地址,nn1所在地址  -->  
11. <property>  
12.     <name>dfs.namenode.rpc-address.ns1.nn1</name>  
13. 1:8020</value>  
14. </property>  
15. <!-- nn1的http通信地址,外部访问地址 -->  
16. <property>  
17.     <name>dfs.namenode.http-address.ns1.nn1</name>  
18. :50070</value>  
19. </property>  
20. <!-- nn2的RPC通信地址,nn2所在地址 -->  
21. <property>  
22.     <name>dfs.namenode.rpc-address.ns1.nn2</name>  
23. 2:8020</value>  
24. </property>  
25. <!-- nn2的http通信地址,外部访问地址 -->  
26. <property>  
27.     <name>dfs.namenode.http-address.ns1.nn2</name>  
28. 2:50070</value>  
29. </property>  
30. <!-- 指定NameNode的元数据在JournalNode日志上的存放位置(一般和zookeeper部署在一起) -->  
31. <property>  
32.     <name>dfs.namenode.shared.edits.dir</name>  
33. //node2:8485;node3:8485;node4:8485/ns1</value>  
34. </property>  
35. <!-- 指定JournalNode在本地磁盘存放数据的位置 -->  
36. <property>  
37.     <name>dfs.journalnode.edits.dir</name>  
38. journal/data</value>  
39. </property>  
40. <!--客户端通过代理访问namenode,访问文件系统,HDFS 客户端与Active 节点通信的Java 类,使用其确定Active 节点是否活跃  -->  
41. <property>  
42.     <name>dfs.client.failover.proxy.provider.ns1</name>  
43.     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>  
44. </property>  
45. <!--这是配置自动切换的方法,有多种使用方法,具体可以看官网,在文末会给地址,这里是远程登录杀死的方法  -->  
46. <property>  
47.     <name>dfs.ha.fencing.methods</name>  
48. true)试试,也是可以的,这个脚本do nothing 返回0  
49. </property>  
50. <!-- 这个是使用sshfence隔离机制时才需要配置ssh免登陆 -->  
51. <property>  
52. private-key-files</name>  
53.     <value>/root/.ssh/id_rsa</value>  
54. </property>  
55. <!-- 配置sshfence隔离机制超时时间,这个属性同上,如果你是用脚本的方法切换,这个应该是可以不配置的 -->  
56. <property>  
57.     <name>dfs.ha.fencing.ssh.connect-timeout</name>  
58. 30000</value>  
59. </property>  
60. <!-- 这个是开启自动故障转移,如果你没有自动故障转移,这个可以先不配 -->  
61. <property>  
62.     <name>dfs.ha.automatic-failover.enabled</name>  
63. true</value>  
64. </property>  
65. </configuration>

4)安装zookeeper并且配置环境变量ZOOKEEPER_HOME,把zoo_example.cfg重命名为zoo.cfg配置文件

    默认配置如下图:

  

hdfs clinet 高可用 hadoop高可用_hadoop_02

在文件结尾添加 zookeeper服务器的配置:

  1. server.1=node1:2888:3888
  2. server.2=node2:2888:3888
  3. 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状态。