Hadoop高可用性部署

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. 配置机器如下:

 NNDNJNZKZKFC
node11  11
node211111
node3 111 
node4 11  

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.     <value>hdfs://ns1</value>  
  5. </property>  
  6. <property>  
  7.     <name>hadoop.tmp.dir</name>  
  8.     <value>/home/tmp/data</value>  
  9. </property>  
  10. <property>  
  11.     <name>ha.zookeeper.quorum</name>  
  12.     <value>node1: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.     <value>node1:8020</value>  
  14. </property>  
  15. <!-- nn1的http通信地址,外部访问地址 -->  
  16. <property>  
  17.     <name>dfs.namenode.http-address.ns1.nn1</name>  
  18.     <value>node1:50070</value>  
  19. </property>  
  20. <!-- nn2的RPC通信地址,nn2所在地址 -->  
  21. <property>  
  22.     <name>dfs.namenode.rpc-address.ns1.nn2</name>  
  23.     <value>node2:8020</value>  
  24. </property>  
  25. <!-- nn2的http通信地址,外部访问地址 -->  
  26. <property>  
  27.     <name>dfs.namenode.http-address.ns1.nn2</name>  
  28.     <value>node2:50070</value>  
  29. </property>  
  30. <!-- 指定NameNode的元数据在JournalNode日志上的存放位置(一般和zookeeper部署在一起) -->  
  31. <property>  
  32.     <name>dfs.namenode.shared.edits.dir</name>  
  33.     <value>qjournal://node2:8485;node3:8485;node4:8485/ns1</value>  
  34. </property>  
  35. <!-- 指定JournalNode在本地磁盘存放数据的位置 -->  
  36. <property>  
  37.     <name>dfs.journalnode.edits.dir</name>  
  38.     <value>/opt/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.     <value>sshfence</value>     ----这个参数的值可以有多种,你也可以换成shell(/bin/true)试试,也是可以的,这个脚本do nothing 返回0  
  49. </property>  
  50. <!-- 这个是使用sshfence隔离机制时才需要配置ssh免登陆 -->  
  51. <property>  
  52.     <name>dfs.ha.fencing.ssh.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.     <value>30000</value>  
  59. </property>  
  60. <!-- 这个是开启自动故障转移,如果你没有自动故障转移,这个可以先不配 -->  
  61. <property>  
  62.     <name>dfs.ha.automatic-failover.enabled</name>  
  63.     <value>true</value>  
  64. </property>  
  65. </configuration>  

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

    默认配置如下图:

  

在文件结尾添加 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状态。

   

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值