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 添加指定两个组件用户:
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
修改 core-site.xml
添加
<!-- 指定hdfs的nameservice -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181</value>
</property>
修改 hdfs-site.xml
<configuration>
<!-- 指定hdfs的nameservice -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 指定hdfs的namenode标识 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- namenode的rpc-address -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>machine1.example.com:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>machine2.example.com:8020</value>
</property>
<!-- namenode的http-address -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>machine1.example.com:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>machine2.example.com:9870</value>
</property>
<!-- 指定namenode的edits元数据在JournalNode上的存放位置,输入规划的journalnode的hostnames-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value>
</property>
<!-- 配置失败自动切换实现的Java类 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,有ssh和shell-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/dfs/jn</value>
</property>
<!-- 开启自动故障转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</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
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