如何手动搭建Hadoop-HA(高可用)模式?(内含报错和解决方法)
如何搭建Hadoop-HA(高可用)模式?前置条件集群架构设计修改配置文件第一步第二步第三步分发配置文件格式化第一步第二步第三步启动集群启动zookeeper启动JournalNode启动备用节点上的RMzkfc未启动的情况(可选)启动JobHistory前置条件我们需要一个Hadoop集群(至少三台虚拟机),并且配置好zookeeper。如果这两个要求还没有做到或者有疑问,请移步到我的另外两篇博
如何搭建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
里查看具体原因
目前个人已知的错误情况,大部分是因为配置文件仍然有小问题,而导致无法启动;也有少数情况是因为端口被占用,如果是这样请试着换一台虚拟机开启历史服务;还有没总结到的报错请在评论区留言!
更多推荐
所有评论(0)