Hadoop HA模式搭建(高可用)

1:集群规划

一共三台虚拟机,分别为master、worker1、worker2;
namenode三台上都有,resourcemanager在worker1,woker2上。

master woker1 worker2
NameNode yes yes yes
DataNode no yes yes
JournalNode yes yes yes
NodeManager no yes yes
ResourceManager no yes yes
Zookeeper yes yes yes
ZKFC yes yes yes

规划好后,开始进行配置

2:Zookeeper集群搭建:

参考
https://blog.csdn.net/l1682686/article/details/107998554

3:修改Hadoop集群配置文件

core-site.xml:

  1. <configuration>
  2. <!-- 指定hdfs的nameservice为cluster1 -->
  3. <property>
  4. <name>fs.defaultFS</name>
  5. <value>hdfs://cluster1/</value>
  6. </property>
  7. <!-- 指定hadoop临时目录 -->
  8. <property>
  9. <name>hadoop.tmp.dir</name>
  10. <value>/home/hadoop/data/tmp/</value>
  11. </property>
  12. <!-- 指定zookeeper地址 -->
  13. <property>
  14. <name>ha.zookeeper.quorum</name>
  15. <value>master:2181,worker1:2181,worker2:2181</value>
  16. </property>
  17. <!-- hadoop链接zookeeper的超时时长设置 -->
  18. <property>
  19. <name>ha.zookeeper.session-timeout.ms</name>
  20. <value>1000</value>
  21. <description>ms</description>
  22. </property>
  23. <!--以下设置和本次HA配置无关
  24. <property>
  25. <name>hadoop.proxyuser.hadoop.hosts</name>
  26. <value>*</value>
  27. </property>
  28. <property>
  29. <name>hadoop.proxyuser.hadoop.groups</name>
  30. <value>*</value>
  31. </property>
  32. -->
  33. </configuration>

hdfs-site.xml:

  1. <configuration>
  2. <!-- 指定副本数 -->
  3. <property>
  4. <name>dfs.replication</name>
  5. <value>2</value>
  6. </property>
  7. <!-- 配置namenode和datanode的工作目录-数据存储目录 -->
  8. <property>
  9. <name>dfs.namenode.name.dir</name>
  10. <value>/home/hadoop/data/dfs/name</value>
  11. </property>
  12. <property>
  13. <name>dfs.datanode.data.dir</name>
  14. <value>/home/hadoop/data/dfs/data</value>
  15. </property>
  16. <!-- 启用webhdfs -->
  17. <property>
  18. <name>dfs.webhdfs.enabled</name>
  19. <value>true</value>
  20. </property>
  21. <!--指定hdfs的nameservice为cluster1,需要和core-site.xml中的保持一致
  22. dfs.ha.namenodes.[nameservice id]为在nameservice中的每一个NameNode设置唯一标示符。
  23. 配置一个逗号分隔的NameNode ID列表。这将是被DataNode识别为所有的NameNode。
  24. 例如,如果使用"cluster1"作为nameservice ID,并且使用"nn1"和"nn2"作为NameNodes标示符
  25. -->
  26. <property>
  27. <name>dfs.nameservices</name>
  28. <value>cluster1</value>
  29. </property>
  30. <!-- cluster下面有3个NameNode,分别是nn1,nn2,nn3-->
  31. <property>
  32. <name>dfs.ha.namenodes.cluster1</name>
  33. <value>nn1,nn2,nn3</value>
  34. </property>
  35. <!-- nn1的RPC通信地址 -->
  36. <property>
  37. <name>dfs.namenode.rpc-address.cluster1.nn1</name>
  38. <value>master:9000</value>
  39. </property>
  40. <!-- nn1的http通信地址 -->
  41. <property>
  42. <name>dfs.namenode.http-address.cluster1.nn1</name>
  43. <value>master:9870</value>
  44. </property>
  45. <!-- nn2的RPC通信地址 -->
  46. <property>
  47. <name>dfs.namenode.rpc-address.cluster1.nn2</name>
  48. <value>worker1:9000</value>
  49. </property>
  50. <!-- nn2的http通信地址 -->
  51. <property>
  52. <name>dfs.namenode.http-address.cluster1.nn2</name>
  53. <value>worker1:9870</value>
  54. </property>
  55. <!-- nn3的RPC通信地址 -->
  56. <property>
  57. <name>dfs.namenode.rpc-address.cluster1.nn3</name>
  58. <value>worker2:9000</value>
  59. </property>
  60. <!-- nn3的http通信地址 -->
  61. <property>
  62. <name>dfs.namenode.http-address.cluster1.nn3</name>
  63. <value>worker2:9870</value>
  64. </property>
  65. <!-- 指定NameNode的edits元数据的共享存储位置。也就是JournalNode列表
  66. 该url的配置格式:qjournal://host1:port1;host2:port2;host3:port3/journalId
  67. journalId推荐使用nameservice,默认端口号是:8485 -->
  68. <property>
  69. <name>dfs.namenode.shared.edits.dir</name>
  70. <value>qjournal://master:8485;worker1:8485;worker2:8485/cluster1</value>
  71. </property>
  72. <!-- 指定JournalNode在本地磁H的位置 -->
  73. <property>
  74. <name>dfs.journalnode.edits.dir</name>
  75. <value>/home/hadoop/data/Hadoop-HA/journaldata</value>
  76. </property>
  77. <!-- 开启NameNode失败自动切换 -->
  78. <property>
  79. <name>dfs.ha.automatic-failover.enabled</name>
  80. <value>true</value>
  81. </property>
  82. <!-- 配置失败自动切换实现方式 -->
  83. <property>
  84. <name>dfs.client.failover.proxy.provider.cluster1</name>
  85. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  86. </property>
  87. <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行 -->
  88. <property>
  89. <name>dfs.ha.fencing.methods</name>
  90. <value>
  91. sshfence
  92. shell(/bin/true)
  93. </value>
  94. </property>
  95. <!-- 使用sshfence隔离机制时需要ssh免登陆 -->
  96. <property>
  97. <name>dfs.ha.fencing.ssh.private-key-files</name>
  98. <value>/home/hadoop/.ssh/id_rsa</value>
  99. </property>
  100. <!-- 配置sshfence隔离机制超时时间 -->
  101. <property>
  102. <name>dfs.ha.fencing.ssh.connect-timeout</name>
  103. <value>30000</value>
  104. </property>
  105. <property>
  106. <name>ha.failover-controller.cli-check.rpc-timeout.ms</name>
  107. <value>60000</value>
  108. </property>
  109. </configuration>

mapred-site.xml

  1. <configuration>
  2. <!-- 指定mr框架为yarn方式 -->
  3. <property>
  4. <name>mapreduce.framework.name</name>
  5. <value>yarn</value>
  6. </property>
  7. <!-- 指定mapreduce jobhistory地址 -->
  8. <property>
  9. <name>mapreduce.jobhistory.address</name>
  10. <value>master:10020</value>
  11. </property>
  12. <!-- 任务历史服务器的web地址 -->
  13. <property>
  14. <name>mapreduce.jobhistory.webapp.address</name>
  15. <value>master:19888</value>
  16. </property>
  17. </configuration>

都修改好了,就分发给其他集群节点
(在hadoop/etc路径下)

  1. scp -r hadoop/ hadoop@worker1:PWD
  2. scp -r hadoop/ hadoop@worker2:PWD

4:启动zookeeper集群

在每台机器上启动:

  1. zkServer.sh start
  2. zkServer.sh status

image.png

5: 格式化namenode、zkfc

首先,在所有虚拟机上启动journalnode:

  1. hdfs --daemon start journalnode

image.png
都启动完毕之后,在master节点上,格式化namenode

  1. hadoop namenode -format

然后单独启动namenode:

  1. hdfs namenode

image.png
然后,在另外两台机器上,同步格式化好的namenode:

  1. hdfs namenode -bootstrapStandby

应该能从master上看到传输信息。
传输完成后,在master节点上,格式化zkfc:

  1. hdfs zkfc -formatZK

6:启动hdfs

在master节点上,先启动dfs:

  1. start-dfs.sh

可以看到各个节点的进程启动情况:
master:
image.png
worker1:
image.png
worker2:
image.png

然后启动yarn:

  1. start-yarn.sh

image.png

worker1:
image.png

worker2:
image.png
启动mapreduce任务历史服务器:

  1. mapred --daemon start historyserver

image.png

7:尝试HA模式

首先看看各个namenode主机状态:

  1. hdfs haadmin -getServiceState nn1

image.png
可以看到,有两个standby,一个active。
在active的master节点上,kill掉namenode进程:
image.png
再次查看节点状态:
image.png
可以看到,nn2已经切换为active,Hadoop 高可用集群基本搭建完成。