‌CentOS 7 搭建Hadoop HA 高可用完全分布式集群指南‌

一、基础环境准备

点击这里查看。在已搭建 Hadoop 完全分布式集群基础之上搭建 HA 模式。

  • 关闭防火墙和SELinux

  • 配置主机名解析

  • 配置SSH免密登录

  • 安装JDK 8

二、ZooKeeper 集群搭建

点击这里查看

三、Hadoop HA 集群配置

1.核心配置文件

core-site.xml

<!-- 全局文件系统URI -->  
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://mycluster</value>  <!-- HDFS逻辑集群名 -->
</property>

<!-- 用于 Namenode、DataNode、Journalnode 等存放数据的公共目录,也可以分开指定 -->  
<property>  
    <name>hadoop.tmp.dir</name>
    <value>/opt/apps/hadoop-2.7.6/data/tmp</value>
</property>

<!-- 指定 ZooKeeper 集群的地址和端口 -->  
<property>
    <name>ha.zookeeper.quorum</name>
    <value>hadoop101:2181,hadoop102:2181,hadoop103:2181</value>
</property>

hdfs-site.xml

<!-- 高可用相关配置 -->
<!-- 指定 DateNode 存储 block 的副本数 -->
<property>
    <name>dfs.replication</name>
    <value>3</value>
</property>

<property>
    <name>dfs.nameservices</name>
    <value>mycluster</value>  <!-- 必须与core-site中的集群名一致 -->
</property>

<!-- 指定 NameNode 集群下的 NameNode 机器 -->
<property>
    <name>dfs.ha.namenodes.mycluster</name>
    <value>nn1,nn2</value>
</property>

<!-- nn1 的RPC地址 -->
<property>
    <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    <value>hadoop101:9000</value>
</property>
<property>
    <name>dfs.namenode.http-address.mycluster.nn1</name>
    <value>hadoop101:50070</value>
</property>

<!-- nn2 的RPC地址 -->
<property>
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    <value>hadoop102:9000</value>
</property>
<property>
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>hadoop102:50070</value>
</property>

<!-- 指定 nn1 和 nn2 的元数据在 JournalNode 上的存储位置 -->  
<property>  
    <name>dfs.namenode.shared.edits.dir</name>  
    <value>qjournal://hadoop101:8485;hadoop102:8485;hadoop103:8485/mycluster</value>  
</property>

<!-- 指定 JournalNode 的本地磁盘存储位置 -->  
<property>  
    <name>dfs.journalnode.edits.dir</name>  
    <value>/opt/apps/hadoop-2.7.6/data/journal</value>  
</property>

<!-- 配置 mycluster 集群的 NameNode 失败时实现自动切换 -->
<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>

<!-- 配置 Client 的 failover 代理 -->  
<property>
    <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

<!-- 配置隔离机制,已使用 SSH 方式进行 NameNode 的切换 -->
<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>

<!-- connect-timeout 链接超时 -->
<property>
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>30000</value>
</property>

yarn-site.xml

<!-- 启动 HA -->
<property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
</property>

<!-- 标识集群 -->
<property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>yarn-cluster</value>
</property>

<!-- 指定两个 ResourceManager 的名称 -->
<property>
    <name>yarn.resourcemanager.ha.rm-ids</name>  
    <value>rm1,rm2</value>  
</property>

<!-- 指定 rm1 的地址 -->
<property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>hadoop101</value>
</property>

<!-- 指定 rm2 的地址 -->
<property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>hadoop102</value>
</property>

<!-- 指定 ZooKeeper 集群 -->
<property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>hadoop101:2181,hadoop102:2181,hadoop103:2181</value>
</property>

<!-- 启动 NodeManager 时,server的加载方式 -->
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>

mapred-site.xml

<!-- 指定 MapReduce 在 YARN 上运行-->
<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>

slaves

hadoop101
hadoop102
hadoop103

hadoop-env.sh、mapred-env.sh、yarn-env.sh 文件中加入 JAVA_HOME环境变量

export JAVA_HOME=/opt/apps/jdk1.8.0_202
温馨提示
如果使用 hadoop-3.x.x 版本以上进行搭建,则需要在 hadoop-env.sh 文件末尾处添加如下内容:
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
将上述所有配置文件远程复制到其他2台节点上。
# 将 hadoop101 上的所有核心配置文件远程复制到 hadoop102、hadoop103相应的目录下
[root@hadoop101 hadoop-2.7.6]# scp -r /opt/apps/hadoop-2.7.6/etc/hadoop/* hadoop102:/opt/apps/hadoop-2.7.6/etc/hadoop/
[root@hadoop101 hadoop-2.7.6]# scp -r /opt/apps/hadoop-2.7.6/etc/hadoop/* hadoop103:/opt/apps/hadoop-2.7.6/etc/hadoop/

2.格式化并启动集群

# 启动 JournalNode(所有节点):由于是第一次启动,在启动 hadoop 之前,需要先格式化 NameNode。格式化 NameNode 需要先启动 JournalNode(以后不必了),在3个节点上分别执行以下命令,启动 journalnode
[root@hadoop101 hadoop-2.7.6]# hadoop-daemon.sh start journalnode
[root@hadoop102 hadoop-2.7.6]# hadoop-daemon.sh start journalnode
[root@hadoop103 hadoop-2.7.6]# hadoop-daemon.sh start journalnode

# 需要先在3台节点上启动 Zookeeper 集群,再执行以下命令
# 格式化 HDFS(仅在 hadoop101 执行)之前,需要将3台节点上hadoop-2.7.6目录下的data、logs目录全部删除。
[root@hadoop101 hadoop-2.7.6]# hdfs namenode -format

# 将 hadoop101 节点格式化后的data文件夹远程复制到 hadoop102 节点的安装目录下
[root@hadoop101 hadoop-2.7.6]# scp -r ./data hadoop102:/opt/apps/hadoop-2.7.6

# 在 hadoop101 上执行 hdfs zkfc -formatZK,只需要执行一次,且仅在 hadoop101 节点上
[root@hadoop101 hadoop-2.7.6]# hdfs zkfc -formatZK

# 在 hadoop101 节点上执行以下命令,启动 HDFS 和 YARN
[root@hadoop101 hadoop-2.7.6]# start-dfs.sh
[root@hadoop101 hadoop-2.7.6]# start-yarn.sh

用物理机上的浏览器分别访问监测YARN和hadoop的运行状态页面:http://192.168.220.30:8088http://192.168.220.30:50070

四、验证并测试集群

1.进程检查

# NameNode 节点应有进程
[root@hadoop101 hadoop-2.7.6]# jps | grep -E 'NameNode|JournalNode|DFSZKFailoverController'
[root@hadoop102 hadoop-2.7.6]# jps | grep -E 'NameNode|JournalNode|DFSZKFailoverController'

# DataNode 节点应有进程
[root@hadoop101 hadoop-2.7.6]# jps | grep -E 'DataNode|NodeManager'
[root@hadoop102 hadoop-2.7.6]# jps | grep -E 'DataNode|NodeManager'
[root@hadoop103 hadoop-2.7.6]# jps | grep -E 'DataNode|NodeManager'

 2.HDFS HA测试

# 查看 NameNode 状态
[root@hadoop101 hadoop-2.7.6]# hdfs haadmin -getServiceState nn1

# 手动触发故障转移
[root@hadoop101 hadoop-2.7.6]# hdfs haadmin -transitionToActive --forcemanual nn2

3.YARN HA 测试

# 提交测试作业  
[root@hadoop101 hadoop-2.7.6]# yarn jar /opt/apps/hadoop-2.7.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar pi 10 1000

# 查看 ResourceManager状态
[root@hadoop102 hadoop-2.7.6]# yarn rmadmin -getServiceState rm1