如何搭建Hadoop-HA(高可用)模式?
前置条件
我们需要一个Hadoop集群(至少三台虚拟机),并且配置好zookeeper。如果这两个要求还没有做到或者有疑问,请移步到我的另外两篇博文,都有详细教程:
Hadoop的安装、配置、初步使用!(附加集群)
于Hadoop集群上进行的zookeeper配置、时间同步
集群架构设计
主机名 | IP | NameNode | ResourceManage | zkfc | DataNode | NodeManager | Journalnode | zookeeper | JobHistory |
---|---|---|---|---|---|---|---|---|---|
HadoopX | 192.168.23.200 | √ | √ | √ | √ | √ | √ | √ | |
HadoopX1 | 192.168.23.201 | √ | √ | √ | √ | √ | √ | √ | |
HadoopX2 | 192.168.23.202 | √ | √ | √ | √ | √ |
修改配置文件
以下修改配置文件的操作均只在HadoopX(主节点)上先行操作
第一步
修改core-site.xml
文件
<configuration>
<!-- 指定hdfs的nameservice为ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>HadoopX:2181,HadoopX1:2181,HadoopX2: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
文件
<configuration>
<!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!-- ns下面有两个NameNode,分别是HadoopX,HadoopX1 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>HadoopX,HadoopX1</value>
</property>
<!-- HadoopX的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.HadoopX</name>
<value>HadoopX:9000</value>
</property>
<!-- HadoopX的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.HadoopX</name>
<value>HadoopX:50070</value>
</property>
<!-- HadoopX1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.HadoopX1</name>
<value>HadoopX1:9000</value>
</property>
<!-- HadoopX1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.HadoopX1</name>
<value>HadoopX1:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://HadoopX:8485;HadoopX1:8485;HadoopX2:8485/ns</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop/tmp/journal</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</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>
</configuration>
另外,在HA模式下节点数可以不配置
<!-- 节点数,ha中可不配置 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
原本的secondary namenode则需要注释或删除
<!--当使用HA配置集群,则不需要secondary namenode
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>192.168.23.50:50090</value>
</property>
-->
第三步
mapred-site.xml
文件不用修改
修改yarn-site.xml
文件
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 开启RM高可用 --> <!-- RM 代指 resource manager -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster_id</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>HadoopX</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>HadoopX1</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>HadoopX:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>HadoopX1:8088</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>HadoopX:2181,HadoopX1:2181,HadoopX2:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
原本配置的RM这里要删除或注释
<!--非HA模式下指定resourcemanager
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>-->
原本这里的配置可以保留,目前没发现会产生Fatal Error
在启动JobHistory服务时查看日志文件,里面会有Error但是不影响
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
分发配置文件
如果之后发现刚才的配置文件有地方报错或者还需要修改,并且已经在其他机器上生效,请在重新修改后,直接返回到这一步来继续操作!!!
由于刚才我们只在HadoopX(主节点)上修改了配置,现在要把修改好的配置文件传给其他集群内的虚拟机
# 可以去到这些配置文件的所在目录下
cd /opt/hadoop/etc/hadoop
scp core-site.xml HadoopX1:$PWD
scp hdfs-site.xml HadoopX1:$PWD
scp yarn-site.xml HadoopX1:$PWD
scp core-site.xml HadoopX2:$PWD
scp hdfs-site.xml HadoopX2:$PWD
scp yarn-site.xml HadoopX2:$PWD
# 或者使用绝对路径
scp /opt/hadoop/etc/hadoop/core-site.xml HadoopX1:$PWD
...
格式化
第一步
首先停用所有的服务stop-all.sh
然后来到/opt/hadoop
目录下
删除logs和tmp目录rm -rf logs/ rm -rf tmp/
以上操作在所有虚拟机上都要完成
第二步
然后只在主节点上格式化hadoop namenode -format
报错案例一:
配置文件有问题,请仔细阅读红色ERROR后的报错信息,然后回去修改,记得重新发给其他虚拟机
报错案例二:
如果遇到这种情况,请先启动JournalNodehadoop-daemons.sh start journalnode
,再进行格式化;目前博主学资尚浅,无法解释其中原因,如果有知道的还请在评论区留言!
第三步
复制主节点的tmp
文件夹到HadoopX1上(这里的HadoopX1为我个人的“备用”节点,参考开头的集群结构设计)
scp -r tmp Hadoop1:$PWD
启动集群
这里的操作具体请参考我写在开头的集群结构设计,情况因人而异,请务必不要完全照搬!
启动zookeeper
所有虚拟机均需要
/opt/zk/bin/zkServer.sh start
启动JournalNode
所有虚拟机均需要(如果在格式化前已经启动过,则跳过这一步)
hadoop-daemons.sh start journalnode
start-all
在主节点上启动start-all.sh
,启动后用jps查看是否有服务未能启动成功
错误案例:
这里的Namenode就没有启动,我们可以去日志文件里查看具体报错信息,记得将.out换成.log后缀
启动备用节点上的RM
在HadoopX1上启动resource manager
yarn-daemon.sh start resourcemanager
zkfc未启动的情况
这是在我的主节点上的服务:
有人可能会观察到zkfc服务没有启动,对此我们需要如下两步来启动它:
1.主节点上格式化zkfc
hdfs zkfc -formatZK
2.主、备节点启动zkfc
hadoop-daemon.sh start zkfc
这样主节点所有所需的服务都开启了:
(可选)启动JobHistory
因为我在之前的配置里将JobHistory的设置在第三台虚拟机(HadoopX2)上,所以先去那里启动一下
mr-jobhistory-daemon.sh start historyserver
如果在一段时间(大约一到两分钟)后JobHistory服务仍然存在,则说明历史服务启动成功!
如果JobHistory服务没有显示,请去日志文件vi /opt/hadoop/logs/mapred-root-historyserver-HadoopX2.log
里查看具体原因
目前个人已知的错误情况,大部分是因为配置文件仍然有小问题,而导致无法启动;也有少数情况是因为端口被占用,如果是这样请试着换一台虚拟机开启历史服务;还有没总结到的报错请在评论区留言!