前置条件

我们需要一个Hadoop集群(至少三台虚拟机),并且配置好zookeeper。如果这两个要求还没有做到或者有疑问,请移步到我的另外两篇博文,都有详细教程:
Hadoop的安装、配置、初步使用!(附加集群)
于Hadoop集群上进行的zookeeper配置、时间同步

集群架构设计

主机名IPNameNodeResourceManagezkfcDataNodeNodeManagerJournalnodezookeeperJobHistory
HadoopX192.168.23.200
HadoopX1192.168.23.201
HadoopX2192.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里查看具体原因

目前个人已知的错误情况,大部分是因为配置文件仍然有小问题,而导致无法启动;也有少数情况是因为端口被占用,如果是这样请试着换一台虚拟机开启历史服务;还有没总结到的报错请在评论区留言!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐