Apache Zookeeper 部署

Hadoop 的高可用自动故障转移是基于Apache ZooKeeper实现的。要开启Hadoop的自动故障转移,首先要确保 Zookeeper已经部署并启动。ZooKeeper 集群应有三台或更多的节点。

HDFS开启高可用

Hadoop 的高可用模式可以基于 Hadoop 自带的Quorum Journal Manager实现或使用NFS等共享存储来实现。不推荐使用NFS,我们要让 Hadoop 自身功能来实现高可用。另外,Hadoop的高可用如果不开启自动故障转移Automatic Failover,其实是可以不依赖 ZooKeeper。此高可用模式下发生故障之后需要手动切换至备用节点。Automatic Failover 是一个十分重要的功能,通常情况下我们需要开启它,否则算不上一个完整的高可用模式。
修改 hadoop-env.sh
为了使用root用户有权限启动Journal Node 和 ZKFC,修改 hadoop-env.sh 添加指定两个组件用户:

  1. export HDFS_JOURNALNODE_USER=root
  2. export HDFS_ZKFC_USER=root

修改 core-site.xml
添加

  1. <!-- 指定hdfs的nameservice -->
  2. <property>
  3. <name>fs.defaultFS</name>
  4. <value>hdfs://mycluster</value>
  5. </property>
  6. <!-- 指定zookeeper地址 -->
  7. <property>
  8. <name>ha.zookeeper.quorum</name>
  9. <value>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181</value>
  10. </property>

修改 hdfs-site.xml

  1. <configuration>
  2. <!-- 指定hdfs的nameservice -->
  3. <property>
  4. <name>dfs.nameservices</name>
  5. <value>mycluster</value>
  6. </property>
  7. <!-- 指定hdfs的namenode标识 -->
  8. <property>
  9. <name>dfs.ha.namenodes.mycluster</name>
  10. <value>nn1,nn2</value>
  11. </property>
  12. <!-- namenode的rpc-address -->
  13. <property>
  14. <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  15. <value>machine1.example.com:8020</value>
  16. </property>
  17. <property>
  18. <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  19. <value>machine2.example.com:8020</value>
  20. </property>
  21. <!-- namenode的http-address -->
  22. <property>
  23. <name>dfs.namenode.http-address.mycluster.nn1</name>
  24. <value>machine1.example.com:9870</value>
  25. </property>
  26. <property>
  27. <name>dfs.namenode.http-address.mycluster.nn2</name>
  28. <value>machine2.example.com:9870</value>
  29. </property>
  30. <!-- 指定namenode的edits元数据在JournalNode上的存放位置,输入规划的journalnode的hostnames-->
  31. <property>
  32. <name>dfs.namenode.shared.edits.dir</name>
  33. <value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value>
  34. </property>
  35. <!-- 配置失败自动切换实现的Java类 -->
  36. <property>
  37. <name>dfs.client.failover.proxy.provider.mycluster</name>
  38. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  39. </property>
  40. <!-- 配置隔离机制方法,有ssh和shell-->
  41. <property>
  42. <name>dfs.ha.fencing.methods</name>
  43. <value>sshfence</value>
  44. </property>
  45. <property>
  46. <name>dfs.ha.fencing.ssh.private-key-files</name>
  47. <value>/root/.ssh/id_rsa</value>
  48. </property>
  49. <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
  50. <property>
  51. <name>dfs.journalnode.edits.dir</name>
  52. <value>/opt/dfs/jn</value>
  53. </property>
  54. <!-- 开启自动故障转移 -->
  55. <property>
  56. <name>dfs.ha.automatic-failover.enabled</name>
  57. <value>true</value>
  58. </property>
  59. </configuration>

启动JournalNode

hdfs --daemon start journalnode

同步NameNode元数据
如果是搭建新集群,在启动JournalNode后需要格式化NameNode

hdfs namenode -format

如果已经格式化了NameNode或者是将非HA集群切换为HA集群,则需要将此前的NameNode元数据目录复制到另一个NameNode节点上,并在未格式化的NameNode节点上运行如下命令

hdfs namenode -bootstrapStandby

如果你要将一个非HA NameNode转换为HA NameNode,需要运行如下命令

hdfs namenode -initializeSharedEdits

初始化HA状态到ZooKeeper

hdfs zkfc -formatZK

启动zkfc进程
在NameNode节点运行命令:

hdfs --daemon start zkfc

启动HDFS
如果使用start-dfs.sh一键启动HDFS,则不需要启动zkfc进程的命令,脚本会同时启动zkfc。

YARN开启高可用

修改yarn-site.xml

<property>
  <name>yarn.resourcemanager.ha.enabled</name>
  <value>true</value>
</property>
<property>
  <name>yarn.resourcemanager.cluster-id</name>
  <value>cluster1</value>
</property>
<property>
  <name>yarn.resourcemanager.ha.rm-ids</name>
  <value>rm1,rm2</value>
</property>
<!--输入指定的两个或多个resourcemanager的hostnames-->
<property>
  <name>yarn.resourcemanager.hostname.rm1</name>
  <value>master1</value>
</property>
<property>
  <name>yarn.resourcemanager.hostname.rm2</name>
  <value>master2</value>
</property>
<property>
  <name>yarn.resourcemanager.webapp.address.rm1</name>
  <value>master1:8088</value>
</property>
<property>
  <name>yarn.resourcemanager.webapp.address.rm2</name>
  <value>master2:8088</value>
</property>
<property>
  <name>hadoop.zk.address</name>
  <value>zk1:2181,zk2:2181,zk3:2181</value>
</property>

启动YARN

$HADOOP_HOME/sbin/start-yarn.sh

或者手动在不同的节点启动对应进程

$HADOOP_HOME/bin/yarn --daemon start resourcemanager
$HADOOP_HOME/bin/yarn --daemon start nodemanager

查看ResourceManager状态

yarn rmadmin -getServiceState rm1

会反馈active或者standy。

Reference

https://hadoop.apache.org/docs/r3.1.3/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithNFS.html
https://hadoop.apache.org/docs/r3.1.3/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html