概述

Ø NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启
Ø NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用
这时可通过此种方式将NameNode很快的切换到另外一台机器。

HDFS-HA配置

原理

zookeeper客户端检测到namenode假死,后通过zookeeper服务器告知另外一个客户端
客户端会进行相关操作
image.png

要点:

1)元数据管理方式需要改变
内存中各自保存一份元数据;
Edits日志只有Active状态的NameNode节点可以做写操作;
两个NameNode都可以读取Edits;
共享的Edits放在一个共享存储中管理(qjournal和NFS两个主流实现);

2)需要一个状态管理功能模块
实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在NameNode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain split现象的发生。

3)必须保证两个NameNode之间能够ssh无密码登录

4)隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务
谁先启动谁创建一把锁,其他namenode无法创建,只有释放锁才能创建。

手动故障转移

1.把原先的集群停掉

2.各节点做一个快照

3.将原Hadoop复制一份拷贝到/opt/ha
①创建/opt/ha目录 并修改所属主和所属组
②将hadoop拷贝过来后,需要将hadoop中的data,logs删除
③将/tmp/*内容也删除掉
④分发

4.每个节点修改HADOOP_HOME(一定一定要source)

5.在core-site.xml中配置

  1. <property>
  2. <name>fs.defaultFS</name>
  3. <value>hdfs://mycluster</value>
  4. </property>
  5. <!-- 自定义标签 -->
  6. <property>
  7. <name>hadoop.data.dir</name>
  8. <value>/opt/ha/hadoop-3.1.3/data</value>
  9. </property>


6.在hdfs-site.xml中配置

  1. <property>
  2. <name>dfs.namenode.name.dir</name>
  3. <value>file://${hadoop.data.dir}/name</value>
  4. </property>
  5. <property>
  6. <name>dfs.datanode.data.dir</name>
  7. <value>file://${hadoop.data.dir}/data</value>
  8. </property>
  9. <property>
  10. <name>dfs.nameservices</name>
  11. <value>mycluster</value>
  12. </property>
  13. <property>
  14. <name>dfs.ha.namenodes.mycluster</name>
  15. <value>nn1,nn2,nn3</value>
  16. </property>
  17. <property>
  18. <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  19. <value>hadoop102:9820</value>
  20. </property>
  21. <property>
  22. <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  23. <value>hadoop103:9820</value>
  24. </property>
  25. <property>
  26. <name>dfs.namenode.rpc-address.mycluster.nn3</name>
  27. <value>hadoop104:9820</value>
  28. </property>
  29. <property>
  30. <name>dfs.namenode.http-address.mycluster.nn1</name>
  31. <value>hadoop102:9870</value>
  32. </property>
  33. <property>
  34. <name>dfs.namenode.http-address.mycluster.nn2</name>
  35. <value>hadoop103:9870</value>
  36. </property>
  37. <property>
  38. <name>dfs.namenode.http-address.mycluster.nn3</name>
  39. <value>hadoop104:9870</value>
  40. </property>
  41. <property>
  42. <name>dfs.namenode.shared.edits.dir</name>
  43. <value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value>
  44. </property>
  45. <!-- 访问代理类,client用于确定哪个NN为Active -->
  46. <property>
  47. <name>dfs.client.failover.proxy.provider.mycluster</name>
  48. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  49. </property>
  50. <!-- 配制隔离机制,即同一时刻只能有一台服务器对外响应 -->
  51. <property>
  52. <name>dfs.ha.fencing.methods</name>
  53. <value>sshfence</value>
  54. </property>
  55. <!-- 使用隔离机制时需要ssh无密登录 -->
  56. <property>
  57. <name>dfs.ha.fencing.ssh.private-key-files</name>
  58. <value>/home/atguigu/.ssh/id_rsa</value>
  59. </property>
  60. <!-- 指定NN的元数据在JournalNode的哪个位置存放 -->
  61. <property>
  62. <name>dfs.journalnode.edits.dir</name>
  63. <value>${hadoop.data.dir}/jn</value>
  64. </property>

下面步骤一定要按顺序执行!!!

1.在每台机器上输入以下命令启动journalnode服务
注意:先将/tmp/下的内容清空

  1. hdfs --daemon start journalnode

2.在hadoop102上,对其进行格式化,并启动

  1. hdfs namenode -format
  2. hdfs --daemon start namenode


3. 在hadoop103和hadoop104上,同步nn1的元数据信息

  1. hdfs namenode -bootstrapStandby


4. 启动NameNode 在hadoop103和hadoop104

  1. hdfs --daemon start namenode


5. 在hadoop102,hadoop103,hadoop104节点上上,启动datanode

  1. hdfs --daemon start datanode


6. 在任意一台节点上将nn1切换为Active

  1. /hdfs haadmin -transitionToActive nn1


7. 在任意一台节点上查看是否Active

  1. hdfs haadmin -getServiceState nn1

自动故障转移

1.在hdfs-site.xml中增加

  1. <property>
  2. <name>dfs.ha.automatic-failover.enabled</name>
  3. <value>true</value>
  4. </property>

2.在core-site.xml文件中增加

  1. <property>
  2. <name>ha.zookeeper.quorum</name>
  3. <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
  4. </property>

1.在任意一台节点上关闭所有HDFS服务:
stop-dfs.sh
2.在任意一台节点上启动Zookeeper集群:
zkCluster.sh start
3.在任意一台节点上初始化HA在Zookeeper中状态:
hdfs zkfc -formatZK
4.在任意一台节点上启动HDFS服务:
start-dfs.sh
5.在任意一台节点上验证
将Active NameNode进程kill
hdfs —daemon stop namenode

YARN-HA配置

原理:

直接由zookeeper进行监控

配置:

1.前面的NN的HA已经配好
2.Yarn-site.xml

  1. <configuration>
  2. <property>
  3. <name>yarn.nodemanager.aux-services</name>
  4. <value>mapreduce_shuffle</value>
  5. </property>
  6. <!--启用resourcemanager ha-->
  7. <property>
  8. <name>yarn.resourcemanager.ha.enabled</name>
  9. <value>true</value>
  10. </property>
  11. <!--声明两台resourcemanager的地址-->
  12. <property>
  13. <name>yarn.resourcemanager.cluster-id</name>
  14. <value>cluster-yarn1</value>
  15. </property>
  16. <property>
  17. <name>yarn.resourcemanager.ha.rm-ids</name>
  18. <value>rm1,rm2,rm3</value>
  19. </property>
  20. <property>
  21. <name>yarn.resourcemanager.hostname.rm1</name>
  22. <value>hadoop102</value>
  23. </property>
  24. <property>
  25. <name>yarn.resourcemanager.hostname.rm3</name>
  26. <value>hadoop104</value>
  27. </property>
  28. <property>
  29. <name>yarn.resourcemanager.hostname.rm2</name>
  30. <value>hadoop103</value>
  31. </property>
  32. <!--指定zookeeper集群的地址-->
  33. <property>
  34. <name>yarn.resourcemanager.zk-address</name>
  35. <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
  36. </property>
  37. <!--启用自动恢复-->
  38. <property>
  39. <name>yarn.resourcemanager.recovery.enabled</name>
  40. <value>true</value>
  41. </property>
  42. <!--指定resourcemanager的状态信息存储在zookeeper集群-->
  43. <property>
  44. <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
  45. </property>
  46. </configuration>

3.(1)在任意一台节点中执行:
start-yarn.sh
(2)查看服务状态
yarn rmadmin -getServiceState rm1

HDFS Federation架构设计

解决namenode数据量不断变大的问题
每个namenode不是互为备份的设计