在搭建HA之前需要先把Hadoop以及zookeeper搭建完成,具体的可参考前面的文章
一、修改配置文件
core-site.xml文件配置
1、指定hdfs的nameservice为ns,ns就是nameservice的缩写;
2、指定zookeeper的地址;
<configuration>
<!-- 指定hdfs的nameservice为ns -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
</property>
<!--指定zookeeper的地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>
hdfs-site.xml配置
1、指定名称服务,要和core-site.xml中的一致;
2、指定名称服务下的namenode节点;
3、http地址,50070端口;
4、rpc地址,9000端口;
5、namenode在journalNode(datanode)上存放数据的端口8485;
6、开启namenode失败自动切换实现方式;
7、配置namenode自动切换实现方式
8、配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行;
9、sshfence超时设置
<configuration>
<!-- 完全分布式集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!-- 集群中NameNode节点都有哪些,这里是hadoop1和hadoop2 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>hadoop01,hadoop2</value>
</property>
<!-- hadoop01的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.hadoop1</name>
<value>hadoop1:9000</value>
</property>
<!-- hadoop02的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.hadoop2</name>
<value>hadoop2:9000</value>
</property>
<!-- hadoop1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.hadoop1</name>
<value>hadoop1:50070</value>
</property>
<!-- hadoop2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.hadoop2</name>
<value>hadoop2:50070</value>
</property>
<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/ns</value>
</property>
<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应,多个机制用换行分割,即每个机制占用一行 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用隔离机制时需要ssh无秘钥登录-->
<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/hadoop/data/jn</value>
</property>
<!-- 关闭权限检查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<!-- sshfence超时设置-->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--开启namenode失败自动切换实现方式-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
yarn.site.xml配置
1、开启resourcemanager高可用;
2、指定rm(resourcemanager)集群id;
3、指定rm集群的名字;
4、rm的映射关系;
5、指定zookeeper集群地址;
<!-- 1、开启RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--2、指定rm集群id-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster_id</value>
</property>
<!--3、指定rm集群的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!--4、指定rm映射关系-->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop2</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop1:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop2:8088</value>
</property>
<!-- 5、指定zookeeper集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
文件配置完成后,需要把文件复制到另外两台虚拟机:
scp core-site.xml hadoop2:$PWD
scp hdfs-site.xml hadoop2:$PWD
scp yarn-site.xml hadoop2:$PWD
二、启动
在启动之前删除hadoop下的tmp文件和logs文件(三个节点都要删)
先启动journalnode,因为在高可用下,格式化format需要借助NameNode才能运行,但是我们已经关闭了所有的进程,所以就需要有一个能代替它的程序,所有启动journalNode。有时候可能不需要启动journalnode 也可以完成格式化。
这里我用了三台虚拟机,所以三台虚拟机都需要启动
hadoop-daemon.sh start journalnode
启动完成后,选择一个主虚拟机进行操作即可。
格式化
hadoop namenode -format
把主节点新产生的tmp文件服饰到备用节点:
scp -r tmp/ hadoop2:$PWD
完成后,启动hdfs:
启动zookeeper,三台机子都要启动:
zkServer.sh start
在备用节点上,启动resourcemanager:
yarn-daemon.sh start resourcemanager
在为leader的节点上格式化zkfc,三个节点启动zkfc
hdfs zkfc -format
启动
hadoop-daemon.sh start zkfc
在配置历史服务的节点上启动历史服务:
mr-jobhistory-daemon.sh start historyserver