基于zookeeper的hadoop HA实现

原文地址:https://blog.csdn.net/everl_1/article/details/52303011

基于zookeeper实现 HDFS之namenode HA
  • 使用journalnode进程,实现active/standby两个namenode进程元数据同步
  • 使用zkfc作为namenode进程的伴随监控进程,用于监控active的状态,并在宕机的时候,切换到standby
  • fencing机制(包括ssh发送kill指令,执行自定义脚本两道保障),防止出现脑裂问题

基于zookeeper实现 YARN之ResourceManager HA
1.   
2.   
3. yarn.resourcemanager.ha.enabled  
4. true  
5.   
6.   
7.   
8. yarn.resourcemanager.cluster-id  
9. yrc  
10.   
11.   
12.   
13. yarn.resourcemanager.ha.rm-ids  
14. rm1,rm2  
15.   
16.   
17.   
18. yarn.resourcemanager.hostname.rm1  
19. sempplsl-07  
20.   
21.   
22. yarn.resourcemanager.hostname.rm2  
23. sempplsl-08  
24.   
25.   
26.   
27. yarn.resourcemanager.zk-address  
28. sempplsl-02:2181,sempplsl-02:2181,sempplsl-02:2181  
29.




==============================================================

基于zookeeper的hadoop HA实现

原创 2016年08月24日 18:28:33
.

非HA弊端

HDFS集群的分布式存储是靠namenode节点(namenode负责响应客户端请求)来实现。在非HA集群中一旦namenode宕机,虽然元数据不会丢失,但整个集群将无法对外提供服务,导致HDFS服务的可靠性不高,这在实际应用场景中显然是不可行的。

HA机制

已知导致服务可靠性不高的原因是namenode节点宕机,那么怎么才能避免这个namenode节点宕机呢?一个容易想到的解决方案是部署两台namenode节点,形成主备模式(active/standby模式),这样一旦active节点宕机,standby节点立即切换到active模式。事实上HA机制就是采取的这种方案。要想实现该机制,需要解决以下问题:

1.为什么选择主备模式,而不是主主模式(active/active模式),也即让两个namenode节点都响应客户端的请求

        一个显然的前提是,两台namenode节点需要保存一致的元数据。
        我们知道namenode节点是用来管理这些元数据的,响应客户端请求时(上传)需要增加元数据信息,如果使用主主模式,那么两个节点都将对元数据进行写操作,怎么同步是个很困难的问题。因此,只能有一台机器响应请求,也即处在active状态的节点(可称为主节点),而另一台namenode在主节点正常工作情况下仅用来同步active节点的元数据信息,这个namenode称为备用节点(处在standby状态),可见,要解决的问题主要是怎么同步active节点的元数据信息。

2.怎么同步两个namenode节点的元数据

      响应客户端请求的是active节点,因此只有active节点保存了最新的元数据。元数据分为两部分,一部分是刚写入新的元数据(edits),另一部分是合并后的较旧的(fsimage)。HA机制解决同步问题的方法是将active节点新写入的edits元数据放在 zookeeper集群 上(zookeeper集群主要功能是实现少量数据的分布式同步管理),standby节点在active节点正常情况下只需要将zookeeper集群上edits文件同步到自己的fsimage中就可以。
       hadoop框架为这个集群专门写了个分布式应用qjournal(依赖zookeeper实现),实现qjournal的节点称为journalnode。

3.怎么感知active节点是否宕机,并将standby节点快速切换到active状态?

        解决方案是专门在namenode节点上启动一个监控进程,时刻监控namenode的状态。对于处在active状态的namenode,如果发现不正常就向zookeeper集群中写入一些数据。对于处在standby状态的namenode,监控进程从zookeeper集群中读数据,从而感知到active节点是否正常。如果发现异常,监控进程负责将standby状态切换到active状态。这个监控进程在hadoop中叫做zkfc(依赖zookeeper实现)。

4.如何在状态切换时避免brain split(脑裂)?

        脑裂:active namenode工作不正常后,zkfc在zookeeper中写入一些数据,表明异常,这时standby namenode中的zkfc读到异常信息,并将standby节点置为active。但是,如果之前的active namenode并没有真的死掉,出现了假死(死了一会儿后又正常了,哈哈,是不是很搞笑),这样,就有两台namenode同时工作了。这种现象称为脑裂。
        解决方案:standby namenode感知到主用节点出现异常后并不会立即切换状态,zkfc会首先通过ssh远程杀死active节点的 namenode进程(kill -9 进程号)。但是(这样还不行,惊讶),如果kill指令没有执行成功咋办??如果在一段时间内没有收到执行成功的回执,standby节点会执行一个自定义脚本,尽量保证不会出现脑裂问题!这个机制在hadoop中称为 fencing (包括ssh发送kill指令,执行自定义脚本两道保障)

解决上诉问题以后,基本上就实现了hadoop HA 。
HA实现
1.HA集群规划
主机名 软件 进程
sempplsl-02 jdk,hadoop,zookeeper QuorumPeerMain(zookeeper),journalnode,datanode,nodemanager
sempplsl-03 jdk,hadoop,zookeeper QuorumPeerMain(zookeeper),journalnode,datanode,nodemanager
sempplsl-04 jdk,hadoop,zookeeper QuorumPeerMain(zookeeper),journalnode,datanode,nodemanager
sempplsl-05 jdk,hadoop namenode,zkfc(active)
sempplsl-06 jdk,hadoop namenode,zkfc
sempplsl-07 jdk,hadoop resourcemanager
sempplsl-08 jdk,hadoop resourcemanager

(注:datanode,nodemanager一般放到一起。
journalnode依赖zookeeper来实现,因此QuorumPeerMain(zookeeper),journalnode必须放一起!)

2.hadoop HA集群配置

core-site.xml   ---->
[html] view plain
copy
  1. <property>  
  2.   
  3. <name>fs.defaultFSname>  
  4. <value>hdfs://ns1/value>  
  5. property>  
  6.    
  7. <property>  
  8. <name>hadoop.tmp.dirname>  
  9. <value>/home/hadoop/app/hadoop-2.4.1/tmpvalue>  
  10. property>  
  11.                   
  12. <property>  
  13. <name>ha.zookeeper.quorumname>  
  14. <value>sempplsl-02:2181,sempplsl-03:2181,sempplsl-04:2181value>  
  15. property>  

hdfs-site.xml  --->
[html] view plain
copy
  1.   
  2. <property>  
  3. <name>dfs.nameservicesname>  
  4. <value>ns1value>  
  5. property>  
  6.   
  7. <property>  
  8. <name>dfs.ha.namenodes.ns1name>  
  9. <value>nn1,nn2value>  
  10. property>  
  11.   
  12. <property>  
  13. <name>dfs.namenode.rpc-address.ns1.nn1name>  
  14. <value>sempplsl-05:9000value>  
  15. property>  
  16.   
  17. <property>  
  18. <name>dfs.namenode.http-address.ns1.nn1name>  
  19. <value>sempplsl-05:50070value>  
  20. property>  
  21.   
  22. <property>  
  23. <name>dfs.namenode.rpc-address.ns1.nn2name>  
  24. <value>sempplsl-06:9000value>  
  25. property>  
  26.   
  27. <property>  
  28. <name>dfs.namenode.http-address.ns1.nn2name>  
  29. <value>sempplsl-06:50070value>  
  30. property>  
  31.   
  32. <property>  
  33. <name>dfs.namenode.shared.edits.dirname>  
  34. <value>qjournal://sempplsl-02:8485;sempplsl-03:8485;sempplsl-04:8485/ns1value>  
  35. property>  
  36.   
  37. <property>  
  38. <name>dfs.journalnode.edits.dirname>  
  39. <value>/home/hadoop/app/hadoop-2.4.1/journaldatavalue>  
  40. property>  
  41.   
  42. <property>  
  43. <name>dfs.ha.automatic-failover.enabledname>  
  44. <value>truevalue>  
  45. property>  
  46.   
  47. <property>  
  48. <name>dfs.client.failover.proxy.provider.ns1name>  
  49. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvidervalue>  
  50. property>  
  51.   
  52. <property>  
  53. <name>dfs.ha.fencing.methodsname>  
  54. <value>  
  55. sshfence  
  56. shell(/bin/true)  
  57. value>  
  58. property>  
  59.   
  60. <property>  
  61. <name>dfs.ha.fencing.ssh.private-key-filesname>  
  62. <value>/home/hadoop/.ssh/id_rsavalue>  
  63. property>  
  64.   
  65. <property>  
  66. <name>dfs.ha.fencing.ssh.connect-timeoutname>  
  67. <value>30000value>  
  68. property>  

yarn-site.xml  --->
[html] view plain
copy
  1.   
  2. <property>  
  3. <name>yarn.resourcemanager.ha.enabledname>  
  4. <value>truevalue>  
  5. property>  
  6.   
  7. <property>  
  8. <name>yarn.resourcemanager.cluster-idname>  
  9. <value>yrcvalue>  
  10. property>  
  11.   
  12. <property>  
  13. <name>yarn.resourcemanager.ha.rm-idsname>  
  14. <value>rm1,rm2value>  
  15. property>  
  16.   
  17. <property>  
  18. <name>yarn.resourcemanager.hostname.rm1name>  
  19. <value>sempplsl-07value>  
  20. property>  
  21. <property>  
  22. <name>yarn.resourcemanager.hostname.rm2name>  
  23. <value>sempplsl-08value>  
  24. property>  
  25.   
  26. <property>  
  27. <name>yarn.resourcemanager.zk-addressname>  
  28. <value>sempplsl-02:2181,sempplsl-02:2181,sempplsl-02:2181value>  
  29. property>  
  30. <property>  
  31. <name>yarn.nodemanager.aux-servicesname>  
  32. <value>mapreduce_shufflevalue>  
  33. property>  

marped-site.xml --->
[html] view plain
copy
  1.   
  2. <property>  
  3. <name>mapreduce.framework.namename>  
  4. <value>yarnvalue>  
  5. property>  

3.HA集群启动

3.1. 修改slaves文件

    slaves文件保存子节点的位置,要在sempplsl-05上启动hdfs,按照集群配置,需要指定datanode在sempplsl-02,sempplsl-03,sempplsl-04上,方法是进入sempplsl-05机器中的hadoop-2.4.1/etc/hadoop安装文件夹。
    此外,在sempplsl-07上启动yarn,按照集群配置,需要指定nodemanager在sempplsl-02,sempplsl-03,sempplsl-04上,方法同上。

3.2.配置无密钥登陆

    配置sempplsl-05到sempplsl-02,sempplsl-03,sempplsl-04,sempplsl-06的无密钥登陆;(ssh-keygen -t rsa,ssh-copy-id 目标主机)
    配置sempplsl-07到sempplsl-02,sempplsl-03,sempplsl-04,sempplsl-08的无密钥登陆;

3.3.将配置好的hadoop copy到集群其它节点

    scp -r

3.4.启动zookeeper集群

    分别在sempplsl-02,sempplsl-03,sempplsl-04机器上执行启动指令:./zkServer.sh start 
    查看zookeeper状态:./zkServer.sh status, 正确的状态是一个leader,两个follower。

3.5.启动journalnode

    分别在sempplsl-02,sempplsl-03,sempplsl-04机器上执行启动指令:sbin/hadoop-daemon.sh start journalnode。
    启动成功后会多出一个JournalNode进程。

3.6. 格式化HDFS

    在sempplsl-05上执行格式化指令:hadoop namenode -format

3.7.格式化zkfc

    在sempplsl-05上执行格式化指令: hdfs zkfc -formatZK
    格式化成功后会在zookeeper集群建立新的文件路径(该路径下存放zkfc监控namenode节点的信息)

3.8.启动HDFS

    在sempplsl-05上执行:start-dfs.sh。

3.9.启动yarn

   在sempplsl-07上执行sbin/start-yarn.sh
   在sempplsl-08上执行./yarn-daemon.sh start resourcemanager
至此,HA集群启动成功!



你可能感兴趣的:(Hadoop)