配置hdfs-site.xml文件
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>centos01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>centos02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>centos01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>centos02:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://centos01:8485;centos02:8485;centos03:8485/mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop/tmp/dfs/jn</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled.mycluster</name>
<value>true</value>
</property>
</configuration>
说明:
dfs.replication:文件在HDFS系统中的副本数。
dfs.nameservices:为nameservice设置一个逻辑名称ID,名称ID可以自定义,这里设置为mycluster,需要使用这个逻辑名称ID作为配置属性的值。后续配置属性将引用这个ID。
dfs.ha.namenodes.mycluster:nameservice中每个nameservice的唯一标识符。属性值是一个以逗号分割的NameNodeID列表。这将被DataNode用于确定集群中的所有NameNode。这里使用mycluster作为nameserviceID,并且使用nn1和nn2作为NameNode的单个ID。
dfs.namenode.rpc-address.mycluster.nn1:设置NameNode的RPC监听地址,需要设置NameNode进程的完整地址和RPC端口。
dfs.namenode.rpc-address.mycluster.nn2:设置另一个NameNode的RPC监听地址,需要设置NameNode进程的完整地址和RPC端口。
dfs.namenode.http-address.mycluster.nn1:设置NameNode的HTTP Web端监听地址,类似于上面的PRC地址,可以通过浏览器查看NameNode状态。
dfs.namenode.rpc-address.mycluster.nn2:设置另一个NameNode的HTTP Web端监听地址,类似于上面的PRC地址,可以通过浏览器查看NameNode状态。
dfs.namenode.shared.edits.dir:设置一组JournalNode的URI地址,活动NameNode将元数据写入这些JournalNode,而备用NameNode则读取这些元数据信息,并作用在内存的目录树中。如果JournalNode有多个节点,则使用分号分割。
dfs.journalnode.edits.dir:JournalNode所在节点上的一个目录,用于存放元数据和其他状态信息。
dfs.client.failover.proxy.provider.mycluster:客户端与活动状态的NameNode进行交互的JAVA实现类。由于有两个NameNode,只有活动NameNode可以对外提供读写服务,当客户端访问HDFS时,客户端将通过该类寻找当前的活动NameNode。目前Hadoop的唯一实现是ConfiguredFailoverProxyProvider类,除非用户自己对其定制,否则应该使用这个类。
dfs.ha.fencing.methods:解决HA集群脑裂问题(即出现两个NameNode同时对外提供服务,导致系统处于不一致状态)。在HDFS HA中,JournalNode只允许一个NameNode对其写入数据,不会出现两个NameNode的问题。但当主/备切换时,之前的活动NameNode能仍在处理客户端的RPC请求,为从需要增加隔离机制,将之前的活动NameNode杀死。常用的fence方法是sshfence,使用SSH需要指定SSH通信使用的密钥文件。
dfs.ha.fencing.ssh.private-key-files:指定上述属性SSH通信使用的密钥文件在系统中的位置。配置SSH无密钥登录所生成的私钥文件,一般在当前用户主目录下的.ssh文件夹中。
dfs.ha.automatic-failover.enabled.mycluster:开启自动故障转移,mycluster为自定义配置的nameserviceID。
配置core-site.xml文件
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>centos01:2181,centos02:2181,centos03:2181</value>
</property>
</configuration>
说明:
fs.defaultFS:HDFS的默认访问路径,也是NameNode的访问地址。
hadoop.tmp.dir:Hadoop数据文件的存放目录。该参数如果不配置默认指向/tmp目录,而/tmp目录在系统重启后会自动清空,从而导致Hadoop的文件系统数据丢失。
ha.zookeeper.quorum:指定ZooKeeper集群个节点主机名及访问端口。
配置yarn-site.xml文件
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<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>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>centos01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>centos02</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>centos01:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>centos02:8088</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>centos01:2181,centos02:2181,centos03:2181</value>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
说明:
yarn.nodemanager.aux-services:NodeManager上运行的附属服务,需配置成mapreduce_shuffle才可正常运行MapReduce程序。YARN提供了该配置项用于再NodeManager上扩展自定义服务,MapReduce的Shuffle功能正式一种扩展服务。
yarn.resourcemanager.ha.enabled:开启Resourcemanager HA功能。
yarn.resourcemanager.cluster-id:标识集群种的Resourcemanager。如果设置该属性,需要确保所有的Resourcemanager在配置中都有自己的ID。
yarn.resourcemanager.ha.rm-ids:Resourcemanager的逻辑ID列表。可以自定义,这里设置为rm1和rm2。后面的配置将引用该ID。
yarn.resourcemanager.hostname.rm1:指定Resourcemanager对应的主机名。另外可以设置Resourcemanager的每个服务地址。
yarn.resourcemanager.hostname.rm2:指定另一个Resourcemanager对应的主机名。
yarn.resourcemanager.webapp.address.rm1:指定Resourcemanager的Web端访问地址。
yarn.resourcemanager.webapp.address.rm2:指定另一个Resourcemanager的Web端访问地址。
yarn.resourcemanager.zk-address:指定集成的ZooKeeper的服务地址。
yarn.resourcemanager.recovery.enabled:启用Resourcemanager重启的功能,默认为false。
yarn.resourcemanager.store.class:用于Resourcemanager状态存储的类,默认为org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore,基于Hadoop文件系统的实现。另外,还可以指定org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore,该类为基于ZooKeeper的实现。这里指定该类。
把三个文件复制到其他的节点
scp -r /etc/hadoop/hdfs-site.xml hadoop@centos02:/usr/local/hadoop/etc/hadoop/
scp -r /etc/hadoop/hdfs-site.xml hadoop@centos03:/usr/local/hadoop/etc/hadoop/
scp -r /etc/hadoop/core-site.xml hadoop@centos02:/usr/local/hadoop/etc/hadoop/
scp -r /etc/hadoop/core-site.xml hadoop@centos03:/usr/local/hadoop/etc/hadoop/
scp -r /etc/hadoop/yarn-site.xml hadoop@centos02:/usr/local/hadoop/etc/hadoop/
scp -r /etc/hadoop/yarn-site.xml hadoop@centos03:/usr/local/hadoop/etc/hadoop/
进入ZooKeeper安装目录,启动ZooKeeper
bin/zkServer.sh start
初始化HA在ZooKeeper的状态
bin/hdfs zkfc -formatZK
启动Hadoop
start-all.sh
启动ZKFC守护进程
sbin/hadoop-daemon.sh start zkfc
两个配置了NameNode节点的进程都执行,先执行命令开启守护进程的NameNode为avtive,后执行的为standby。
查看各节点启动进程
jps
centos01节点包含NameNode, ResourceManager,Jps,DataNode,NodeManager,QuorumPeerMain,DFSZKFailoverController,journalNode。
centos02节点包含NameNode, ResourceManager,Jps,DataNode,NodeManager,QuorumPeerMain,DFSZKFailoverController,journalNode。
centos03节点包含Jps,DataNode,NodeManager,QuorumPeerMain,journalNode。