hadoop-2.7.7 HA完全分布式集群部署详解

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: Hadoop NameNode官方开始支持HA集群默认是从2.0开始,之前的版本均是不支持NameNode HA的高可用的。

1.Hadoop HA简介及工作原理

Hadoop NameNode官方开始支持HA集群默认是从2.0开始,之前的版本均是不支持NameNode HA的高可用的。

1.1 Hadoop HA简介

Hadoop-HA集群运作机制介绍
  • HA即高可用(7*24小时不中断服务)
  • 实现高可用最关键的是消除单点故障
  • 分成各个组件的HA机制——HDFS的HA、YARN的HA
HDFS的HA机制详解

通过双namenode消除单点故障,以下为双namenode协调工作的特点:

A、元数据管理方式需要改变:

  • 内存中各自保存一份元数据
  • Edits日志只能有一份,只有Active状态的namenode节点可以做写操作
  • 两个namenode都可以读取edits
  • 共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现)

B、需要一个状态管理功能模块

  • 实现了一个zkfailover,常驻在每一个namenode所在的节点
  • 每一个zkfailover负责监控自己所在namenode节点,利用zk进行状态标识
  • 当需要进行状态切换时,由zkfailover来负责切换
  • 切换时需要防止brain split现象的发生

    1.2 Hadoop HA工作原理图例

    HDFS的HA架构
    使用 Active NameNode,Standby NameNode 两个结点解决单点问题,两个结点通过JounalNode 共享状态,采用ZKFC选举Active实时监控集群状态,自动进行故障备援。
  • Active NameNode:接受 client 的 RPC 请求并处理,同时写自己的 Editlog 和共享存储上的 Editlog,接收 DataNode 的 Block report, block location updates 和 heartbeat;
  • Standby NameNode:同样会接到来自 DataNode 的 Block report, block location updates 和heartbeat,同时会从共享存储的 Editlog 上读取并执行这些 log 操作,使得自己的 NameNode 中的元数据(Namespcae information + Block locations map)都是和 Active NameNode 中的元数据是同步的。所以说 Standby 模式的 NameNode 是一个热备(Hot Standby NameNode),一旦切换成 Active 模式,马上就可以提供 NameNode 服务
  • JounalNode:用于Active NameNode , Standby NameNode 同步数据,本身由一组 JounnalNode 结点组成,该组结点基数个,支持 Paxos 协议,保证高可用,是 CDH5 唯一支持的共享方式(相对于 CDH4 促在NFS共享方式)
  • ZKFC:监控NameNode进程,自动备援。
    YARN的HA架构
    ResourceManager HA由一对Active,Standby结点构成,通过RMStateStore 存储内部数据和主要应用的数据及标记。

支持可替代的RMStateStore实现方式如下:

  • 基于内存的MemoryRMStateStore
  • 基于文件系统的FileSystemRMStateStore
  • 基于 zookeeper的ZKRMStateStore
    ResourceManager HA 的架构模式同NameNode HA的架构模式基本一致,数据共享由 RMStateStore,而ZKFC成为ResourceManager进程的一个服务,非独立存在。

    1.3Hadoop HA解决方案架构

    Hadoop中的HDFS、MapReduce和YARN的单点故障解决方案架构是完全一致的。
  • 手动模式:指由管理员通过命令进行主备切换,这通常在服务升级时有用。
  • 自动模式:自动模式可降低运维成本并自动切换,但存在潜在危险,如脑裂。

本文将重点介绍下自动模式切换的部署方式。

什么是脑裂:脑裂是Hadoop2.X版本后出现的全新问题,从字面意思我们可以理解为“大脑分裂”;我们想一下,当一个正常人,突然出现有了两个大脑,而且这两个大脑都有自己的意识,对于这个人来说肯定是灾难性问题。同理,在Hadoop中,为了防止单点失效问题而出现了两个namenode(HA机制),这两个namenode正常情况下是起到一个失效,另一个代替的作用,但在实际运行过程中很有可能出现两个namenode同时服务于整个集群的情况,这种情况称之为脑裂。

为什么会出现脑裂:脑裂通常发生在主从namenode切换时,由于ActiveNameNode的网络延迟、设备故障等问题,另一个NameNode会认为活跃的NameNode成为失效状态,此时StandbyNameNode会转换成活跃状态,此时集群中将会出现两个活跃的namenode。因此,可能出现的因素有网络延迟、心跳故障、设备故障等。

怎么解决脑裂问题:1.新增一条心跳线,防止namennode状态无法正常传达。2.使用隔离机制,通过调用活跃节点中的隔离方法,让其主动转换为standby状态,如果该方法失效则使用远程调用执行kill -9命令杀死相应进程,如果该方法仍然无法成功隔离,管理人员可以事先在每台namenode节点中编写一个shell脚本,当出现脑裂问题时,执行该脚本来切断电源,已达到隔离目的。

2.HA环境准备

2.1各主机IP规划

主机名 IP地址 操作系统 安装软件 运行进程
sre01 10.1.8.11 centos7.6 jdk、hadoop、zookeeper NameNode、DFSZKFailoverController(zkfc)、ResourceManager
sre02 10.1.8.12 centos7.6 jdk、hadoop、zookeeper NameNode、DFSZKFailoverController(zkfc)、ResourceManager
sre03 10.1.8.13 centos7.6 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
sre04 10.1.8.14 centos7.6 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
sre05 10.1.8.15 centos7.6 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain

注意:针对HA模式,就不需要SecondaryNameNode了,因为STANDBY状态的namenode会负责做checkpoint。

2.2添加hosts信息,每台机器均需执行。

cat <<EOF > /etc/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.1.8.11 sre01
10.1.8.12 sre02
10.1.8.13 sre03
10.1.8.14 sre04
10.1.8.15 sre05
EOF

2.3实现root用户的免密钥登录(正式环境建议新建用户)。

  • 基本要求如下:
    sre01到sre01、sre02、sre03、sre04、sre05免秘钥登录。
    sre02到sre01、sre02、sre03、sre04、sre05免秘钥登录。
    Ip地址和主机名均可,本文默认使用hostname的方式实现。
    
  • sre01生成密钥并分发密钥至其它机器:
    ssh-keygen -t rsa  # 一路回车
    ssh-copy-id -i ~/.ssh/id_rsa.pub sre01
    ssh-copy-id -i ~/.ssh/id_rsa.pub sre02
    ssh-copy-id -i ~/.ssh/id_rsa.pub sre03
    ssh-copy-id -i ~/.ssh/id_rsa.pub sre04
    ssh-copy-id -i ~/.ssh/id_rsa.pub sre05
    
  • sre02生成密钥并分发密钥至其它机器:
    ssh-keygen -t rsa  # 一路回车
    ssh-copy-id -i ~/.ssh/id_rsa.pub sre01
    ssh-copy-id -i ~/.ssh/id_rsa.pub sre02
    ssh-copy-id -i ~/.ssh/id_rsa.pub sre03
    ssh-copy-id -i ~/.ssh/id_rsa.pub sre04
    ssh-copy-id -i ~/.ssh/id_rsa.pub sre05
    

    2.4安装JDK并配置环境变量

    mkdir -p /usr/java/ /root/software && cd software
    wget https://file.bigdatasafe.org/software/jdk/jdk-8u211-linux-x64.tar.gz
    tar zxvf jdk-8u211-linux-x64.tar.gz -C /usr/java/
    cat <<EOF > /etc/profile.d/jdk.sh
    #!/bin/bash
    export JAVA_HOME=/usr/java/jdk1.8.0_211
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
    export PATH=$JAVA_HOME/bin:$PATH
    EOF
    chmod a+x /etc/profile.d/jdk.sh
    source /etc/profile.d/jdk.sh
    

3.zookeeper集群部署

根据规划在sre01-05上面分布部署zookeeper节点。

3.1下载zookeeper并修改配置文件

mkdir -p /home/hadoop/ /root/software && cd software
wget https://file.bigdatasafe.org/software/zookeeper/zookeeper-3.4.14.tar.gz
tar zxvf zookeeper-3.4.14.tar.gz -C /home/hadoop/
mkdir -p /home/hadoop/zookeeper-3.4.14/{logs,data}
cat <<EOF > /home/hadoop/zookeeper-3.4.14/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/zookeeper-3.4.14/data
dataLogDir=/home/hadoop/zookeeper-3.4.14/logs
clientPort=2181
autopurge.snapRetainCount=500
autopurge.purgeInterval=24
server.1=sre01:2888:3888
server.2=sre02:2888:3888
server.3=sre03:2888:3888
server.4=sre04:2888:3888
server.5=sre05:2888:3888
EOF
#sre01-05分别对应1-5,各自执行即可。
echo "1" > /home/hadoop/zookeeper-3.4.14/data/myid

3.2配置环境变量并启动相关服务

配置环境变量
cat <<EOF > /etc/profile.d/zookeeper.sh
#!/bin/bash
export ZOOKEEPER_HOME=/home/hadoop/zookeeper-3.4.14/
export PATH=$ZOOKEEPER_HOME/bin:$PATH
EOF
chmod a+x /etc/profile.d/zookeeper.sh
source /etc/profile.d/zookeeper.sh
制作启动脚本
cat <<EOF > /home/hadoop/zookeeper-3.4.14/bin/zk.sh
#!/bin/bash
#目的:一键启动zookeeper集群
#联系方式:bigdatasafe@gmail.com
iparray=(sre01 sre02 sre03 sre04 sre05)  
user="root"  
echo "$1"  
if [ $1 = "start" ]  
then  
        cmd="zkServer.sh start"  
fi  

if [ $1 = "stop" ]  
then  
        cmd="zkServer.sh stop"  
fi  

cmd2="jps"  

for ip in ${iparray[*]}  
do  
        echo "ssh to $ip"  
        ssh -t $user@$ip "$cmd"  
        echo "jps:"  
        ssh -t $user@$ip "$cmd2"  
        echo  
done
EOF
chmod a+x /home/hadoop/zookeeper-3.4.14/bin/zk.sh
启动或关闭zookeeper集群
#启动方式
/home/hadoop/zookeeper-3.4.14/bin/zk.sh start
#停止方式
/home/hadoop/zookeeper-3.4.14/bin/zk.sh stop

4.Hadoop HA集群部署

4.1下载软件并修改环境变量

wget https://file.bigdatasafe.org/software/hadoop/hadoop-2.7.7.tar.gz
tar zxvf hadoop-2.7.7.tar.gz -C /home/hadoop/
mkdir -p /home/hadoop/hadoop-2.7.7/{logs,tmp,name,data,journal}
cat <<EOF > /etc/profile.d/hadoop.sh
#!/bin/bash
export HADOOP_HOME=/home/hadoop/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
EOF
chmod a+x /etc/profile.d/hadoop.sh
source /etc/profile.d/hadoop.sh

4.2修改core-site.xml配置文件

cat <<EOF > /home/hadoop/hadoop-2.7.7/etc/hadoop/core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
 <property>
     <name>fs.defaultFS</name>
     <value>hdfs://hadoopha</value>
 </property>
 <property>
     <name>hadoop.tmp.dir</name>
     <value>file:/home/hadoop/hadoop-2.7.7/tmp</value>
 </property>
 <property>
    <name>ha.zookeeper.quorum</name>
    <value>sre01:2181,sre02:2181,sre03:2181,sre04:2181,sre05:2181</value>
 </property>
 <property>
    <name>ha.zookeeper.session-timeout.ms</name>
    <value>15000</value>
 </property>
</configuration>
EOF

4.3修改hdfs-site.xml配置文件

cat <<EOF > /home/hadoop/hadoop-2.7.7/etc/hadoop/hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
#作者:Adil Lau
#联系方式:bigdatasafe@gmail.com
-->
<configuration>
 <property>
     <name>dfs.namenode.name.dir</name>
     <value>file:/home/hadoop/hadoop-2.7.7/name</value>
 </property>
 <property>
     <name>dfs.datanode.data.dir</name>
     <value>file:/home/hadoop/hadoop-2.7.7/data</value>
 </property>
 <property>
     <name>dfs.replication</name>
     <value>3</value>
 </property>
 <!--HA配置 -->
 <property>
     <name>dfs.nameservices</name>
     <value>hadoopha</value>
 </property>
 <property>
     <name>dfs.ha.namenodes.hadoopha</name>
     <value>nn1,nn2</value>
 </property>
 <!--namenode1 RPC端口 -->
 <property>
     <name>dfs.namenode.rpc-address.hadoopha.nn1</name>
     <value>sre01:9000</value>
 </property>
 <!--namenode1 HTTP端口 -->
 <property>
     <name>dfs.namenode.http-address.hadoopha.nn1</name>
     <value>sre01:50070</value>
 </property>
 <!--namenode2 RPC端口 -->
 <property>
     <name>dfs.namenode.rpc-address.hadoopha.nn2</name>
     <value>sre02:9000</value>
 </property>
  <!--namenode2 HTTP端口 -->
 <property>
     <name>dfs.namenode.http-address.hadoopha.nn2</name>
     <value>sre02:50070</value>
 </property>
  <!--HA故障切换 -->
 <property>
     <name>dfs.ha.automatic-failover.enabled</name>
     <value>true</value>
 </property>
 <!-- journalnode 配置 -->
 <property>
     <name>dfs.namenode.shared.edits.dir</name>
     <value>qjournal://sre03:8485;sre04:8485;sre05:8485/hadoopha</value>
 </property>
 <property>
     <name>dfs.client.failover.proxy.provider.hadoopha</name>
     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
 </property>
 <!--发生failover时,Standby的节点要执行一系列方法把原来那个Active节点中不健康的NameNode服务给杀掉,
 这个叫做fence过程。sshfence会通过ssh远程调用fuser命令去找到Active节点的NameNode服务并杀死它-->
 <property>
     <name>dfs.ha.fencing.methods</name>
     <value>shell(/bin/true)</value>
  </property>
   <!--SSH私钥 -->
  <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/root/.ssh/id_rsa</value>
  </property>
 <!--SSH超时时间 -->
  <property>
      <name>dfs.ha.fencing.ssh.connect-timeout</name>
      <value>30000</value>
  </property>
  <!--Journal Node文件存储地址 -->
  <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/home/hadoop/hadoop-2.7.7/journal</value>
  </property>
</configuration>
EOF

4.4修改yarn-site.xml配置文件

cat <<EOF > /home/hadoop/hadoop-2.7.7/etc/hadoop/yarn-site.xml
<?xml version="1.0"?>
<configuration>
    <!-- 开启RM高可用 -->
    <property>
         <name>yarn.resourcemanager.ha.enabled</name>
         <value>true</value>
    </property>
    <!-- 指定RM的cluster id -->
    <property>
         <name>yarn.resourcemanager.cluster-id</name>
         <value>yrc</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>sre01</value>
    </property>
    <property>
         <name>yarn.resourcemanager.hostname.rm2</name>
         <value>sre02</value>
    </property>
    <!-- 指定zk集群地址 -->
    <property>
         <name>yarn.resourcemanager.zk-address</name>
         <value>sre01:2181,sre02:2181,sre03:2181,sre04:2181,sre05:2181</value>
    </property>
    <property>
         <name>yarn.nodemanager.aux-services</name>
         <value>mapreduce_shuffle</value>
    </property>
</configuration>
EOF

4.5修改mapred-site.xml配置文件

cat <<EOF > /home/hadoop/hadoop-2.7.7/etc/hadoop/mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
   <property>
          <name>mapreduce.framework.name</name>
          <value>yarn</value>
   </property>
   <property>
         <name>mapreduce.map.memory.mb</name>
         <value>2048</value>
   </property>
   <property>
          <name>mapreduce.reduce.memory.mb</name>
          <value>2048</value>
   </property>
</configuration>
EOF

4.6修改slaves文件加入节点信息

cat <<EOF > /home/hadoop/hadoop-2.7.7/etc/hadoop/slaves
sre03
sre04
sre05
EOF

4.7分发hadoop文件至其他集群节点

scp -r /home/hadoop/hadoop-2.7.7 sre02:/home/hadoop
scp -r /home/hadoop/hadoop-2.7.7 sre03:/home/hadoop
scp -r /home/hadoop/hadoop-2.7.7 sre04:/home/hadoop
scp -r /home/hadoop/hadoop-2.7.7 sre05:/home/hadoop

5.Hadoop HA集群启动及维护,需按照顺序执行。

5.1初始化zookeeper并启动集群

  • 启动zookeeper节点:sre03、sre04、sre05分别执行
    zkServer.sh start
    
  • 格式化zookeeper节点:sre01执行
    hdfs zkfc -formatZK
    

    5.2初始化hadoop并启动集群

  • 启动journalnode节点:sre03、sre04、sre05分别执行
    hadoop-daemon.sh  start journalnode
    
  • 格式化namenode:sre01上执行
    hdfs namenode -format
    
  • 启动datanode节点:sre03、sre04、sre05分别执行
    hdfs namenode -format
    
  • 启动namenode节点sre01
    hadoop-daemon.sh start namenode
    
  • 启动namenode节点sre02
    hdfs namenode -bootstrapStandby
    hadoop-daemon.sh start namenode
    

    此时sre01和sre02均处于standby状态。

  • 启动zkfc服务:sre01、sre02分别执行
    hadoop-daemon.sh  start zkfc
    
  • 健康状态检查:运行状态说明。
    • 启动zkfc服务后,sre01和sre02会自动选举出active节点。
    • 此时一个节点为active状态,另一个处于standby状态。

5.3 HA故障自动切换测试

集群健康状态下,默认sre01为active状态,sre02为standby状态。
现在模拟sre01节点故障,将sre01服务终止测试sre02是否自动切换为active状态。

  • sre01节点执行:
    jps
    16415 DFSZKFailoverController
    14213 Jps
    15626 NameNode
    kill -9 15626
    
  • sre02状态查看:

此时sre02由standby状态自动切换到active状态,HA故障自动切换测试成功。

注意:生成环境中由于ResourceManager消耗资源过多,建议是单独部署于独立节点运行。

至此Hadoop HA集群部署完毕,如有问题欢迎留言交流。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
2月前
|
存储 分布式计算 算法
探索Hadoop的三种运行模式:单机模式、伪分布式模式和完全分布式模式
在配置Hadoop集群之前,了解这三种模式的特点、适用场景和配置差异是非常重要的。这有助于用户根据个人需求和资源情况,选择最适合自己的Hadoop运行模式。在最初的学习和开发阶段,单机模式和伪分布式模式能为用户提供便利和成本效益。进而,当用户要处理大规模数据集时,完全分布式模式将是理想的选择。
96 2
|
2月前
|
分布式计算 资源调度 Hadoop
Hadoop入门基础(二):Hadoop集群安装与部署详解(超详细教程)(二)
Hadoop入门基础(二):Hadoop集群安装与部署详解(超详细教程)(二)
|
2月前
|
分布式计算 Ubuntu Hadoop
Hadoop入门基础(二):Hadoop集群安装与部署详解(超详细教程)(一)
Hadoop入门基础(二):Hadoop集群安装与部署详解(超详细教程)(一)
|
2月前
|
存储 分布式计算 Hadoop
【揭秘Hadoop背后的秘密!】HDFS读写流程大曝光:从理论到实践,带你深入了解Hadoop分布式文件系统!
【8月更文挑战第24天】Hadoop分布式文件系统(HDFS)是Hadoop生态系统的关键组件,专为大规模数据集提供高效率存储及访问。本文深入解析HDFS数据读写流程并附带示例代码。HDFS采用NameNode和DataNode架构,前者负责元数据管理,后者承担数据块存储任务。文章通过Java示例演示了如何利用Hadoop API实现数据的写入与读取,有助于理解HDFS的工作原理及其在大数据处理中的应用价值。
64 1
|
2月前
|
存储 缓存 分布式计算
|
2月前
|
SQL 分布式计算 Hadoop
centos7通过CDH部署Hadoop
centos7通过CDH部署Hadoop
|
2月前
|
分布式计算 Java Linux
centos7通过Ambari2.74部署Hadoop
centos7通过Ambari2.74部署Hadoop
|
2月前
|
存储 分布式计算 监控
Hadoop在云计算环境下的部署策略
【8月更文第28天】Hadoop是一个开源软件框架,用于分布式存储和处理大规模数据集。随着云计算技术的发展,越来越多的企业开始利用云平台的优势来部署Hadoop集群,以实现更高的可扩展性、可用性和成本效益。本文将探讨如何在公有云、私有云及混合云环境下部署和管理Hadoop集群,并提供具体的部署策略和代码示例。
69 0
|
4月前
|
XML 分布式计算 Hadoop
分布式系统详解--框架(Hadoop-单机版搭建)
分布式系统详解--框架(Hadoop-单机版搭建)
67 0
分布式系统详解--框架(Hadoop-单机版搭建)
|
4月前
|
存储 分布式计算 监控
分布式系统详解--框架(Hadoop-HDFS的HA搭建及测试)
分布式系统详解--框架(Hadoop-HDFS的HA搭建及测试)
52 0