Hadoop-HA高可用分布式集群总结

觉得有帮助的,请多多支持博主,点赞关注哦~

文章目录

  • Hadoop-HA高可用分布式集群
    • 一、HA概述
    • 二、HDFS-HA 工作机制
      • 1、HDFS-HA 工作要点
      • 2、HDFS-HA 自动故障转移工作机制
    • 三、总体配置及准备规划
      • 1、集群规划
      • 2、准备工作
      • 3、修改配置文件
    • 四、HDFS-HA 集群配置
      • 1、配置HDFS-HA集群
      • 2、配置 HDFS-HA 自动故障转移
    • 五、YARN-HA 配置
      • 1、YARN-HA 工作机制
      • 2、配置 YARN-HA 集群
    • 六、整体启动
      • 1、启动zookeeper
      • 2、启动journalnode
      • 3、格式化namenode
      • 4、格式化zkfc
      • 5、启动dfs
      • 6、查看namenode的状态
      • 7、启动yarn
      • 8、查看resourcemanager的状态
      • 9、注意
    • 七、HDFS Federation 架构设计
      • 1、NameNode 架构的局限性
      • 2、HDFS Federation 架构设计
      • 3、HDFS Federation 应用思考

Hadoop-HA高可用分布式集群

一、HA概述

  1. 所谓 HA(high available),即高可用(7*24 小时不中断服务)
  2. 实现高可用最关键的策略是消除单点故障
    HA 严格来说应该分成各个组件的 HA 机制:HDFS 的 HA 和 YARN 的 HA
  3. Hadoop2.0 之前,在 HDFS 集群中 NameNode 存在单点故障(SPOF)
  4. NameNode 主要在以下两个方面影响 HDFS 集群
    NameNode 机器发生意外,如宕机,集群将无法使用,直到管理员重启
    NameNode 机器需要升级,包括软件、硬件升级,此时集群也将无法使用

HDFS HA 功能通过配置 Active/Standby 两个 nameNodes 实现在集群中对 NameNode 的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将 NameNode 很快的切换到另外一台机器

二、HDFS-HA 工作机制

通过双 namenode 消除单点故障

1、HDFS-HA 工作要点

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

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

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

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

3、必须保证两个 NameNode 之间能够 ssh 无密码登录

4、隔离(Fence),即同一时刻仅仅有一个 NameNode 对外提供服务

2、HDFS-HA 自动故障转移工作机制

Hadoop-HA高可用分布式集群总结_第1张图片
自动故障转移为 HDFS 部署增加了两个新组件:

  1. ZooKeeper 进程
  2. ZKFailoverController(ZKFC)进程

ZooKeeper 是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。
HA 的自动故障转移依赖于ZooKeeper 的以下功能:

  1. 故障检测:集群中的每个 NameNode 在 ZooKeeper 中维护了一个持久会话,如果机器崩溃,ZooKeeper 中的会话将终止,ZooKeeper 通知另一个 NameNode 需要触发故障转移。
  2. 现役 NameNode 选择:ZooKeeper 提供了一个简单的机制用于唯一的选择一个节点为 active 状态。如果目前现役 NameNode 崩溃,另一个节点可能从 ZooKeeper 获得特殊的排外锁以表明它应该成为现役 NameNode。

ZKFC 是自动故障转移中的另一个新组件,是 ZooKeeper 的客户端,也监视和管理NameNode 的状态。
每个运行 NameNode 的主机也运行了一个 ZKFC 进程,ZKFC 负责

  1. 健康监测:ZKFC 使用一个健康检查命令定期地 ping 与之在相同主机的 NameNode,只要该 NameNode 及时地回复健康状态,ZKFC 认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。
  2. ZooKeeper 会话管理:当本地 NameNode 是健康的,ZKFC 保持一个在 ZooKeeper中打开的会话。如果本地 NameNode 处于 active 状态,ZKFC 也保持一个特殊的 znode 锁,该锁使用了 ZooKeeper 对短暂节点的支持,如果会话终止,锁节点将自动删除。
  3. 基于 ZooKeeper 的选择:如果本地 NameNode 是健康的,且 ZKFC 发现没有其它的节点当前持有 znode 锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地 NameNode 为 active。故障转移进程与前面描述的手动故障转移相似,首先如果必要保护之前的现役 NameNode,然后本地 NameNode 转换为 active 状态。

三、总体配置及准备规划

这里先将需要修改的配置文件整体总结一下,后续详细说明配置功能。

1、集群规划

Hadoop-HA高可用分布式集群总结_第2张图片

2、准备工作

1、根据规划,需要四台机器。

  • 1和2配置namenode;
  • 1、2、3配置zookeeper;
  • 3、4配置resourcemanager。

2、四台机器完成配置Hadoop完全分布式,123完成zookeeper完全分布式配置。忘记了的可以回去查看我之前的总结。

3、修改配置文件

HA配置,主要修改了core-site.xml、yarn-site.xml、hdfs-site.xml三个配置文件。其他的基本没有改动。

这里将整体总结一下,后边会详细讲作用。

1、core-site.xml
Hadoop-HA高可用分布式集群总结_第3张图片

2、yarn-site.xml



<!-- Site specific YARN configuration properties -->

  yarn.nodemanager.aux-services</name>
  mapreduce_shuffle</value>
</property>

   yarn.log-aggregation-enable</name>
   true</value>
</property>

    yarn.log-aggregation.retain-seconds</name>
    604800</value>
</property>

<!--配置uber mode可用-->

        mapreduce.job.ubertask.enable</name>
        true</value>
</property>

<!--配置ha-->

 yarn.resourcemanager.ha.enabled</name>
 true</value>
</property>

  yarn.resourcemanager.cluster-id</name>
  yrc</value>
</property>

 yarn.resourcemanager.ha.rm-ids</name>
 RM1,RM2</value>
</property>

 yarn.resourcemanager.hostname.RM1</name>
 biubiubiu03</value>
</property>

  yarn.resourcemanager.hostname.RM2</name>
  biubiubiu04</value>
</property>

  yarn.resourcemanager.zk-address</name>
  biubiubiu01:2181,biubiubiu02:2181,biubiubiu03:2181</value>
</property>

  yarn.resourcemanager.recovery.enabled</name>
  true</value>
</property>

  yarn.resourcemanager.store.class</name>
 org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>

</configuration>

3、hdfs-site.xml



     dfs.replication</name>
     3</value>
  </property>
 
    dfs.name.dir</name>
    file:///opt/model/hadoop_data/dfs/name</value>
  </property>
   
    dfs.data.dir</name>
    file:///opt/model/hadoop_data/dfs/data</value>
  </property>
  
    dfs.block.size</name>
    134217728</value>
  </property>
  
   fs.checkpoint.dir</name>
   file:///opt/model/hadoop_data/checkpoint/dfs/cname</value>
  </property>
  
   fs.checkpoint.edits.dir</name>
   file:///opt/model/hadoop_data/checkpoint/dfs/cname</value>
  </property>
  
   dfs.webhdfs.enabled</name>
   true</value>
  </property>
  
   dfs.permissions</name>
   false</value>
  </property>
<!--配置ha-->
  
   dfs.datanode.max.transfer.threads</name>
   4096</value>
  </property>
  
    dfs.nameservices</name>
    mycluster</value>
  </property>
  
    dfs.ha.namenodes.mycluster</name>
    NN1,NN2</value>
  </property>
  
   dfs.namenode.rpc-address.mycluster.NN1</name>
    biubiubiu01:9000</value>
  </property>
  
    dfs.namenode.rpc-address.mycluster.NN2</name>
    biubiubiu02:9000</value>
  </property>
 
 dfs.namenode.servicepc-address.mycluster.NN1</name>
  biubiubiu01:53310</value>
  </property>

 dfs.namenode.servicepc-address.mycluster.NN2</name>
  biubiubiu02:53310</value>
  </property>


 dfs.namenode.http-address.mycluster.NN1</name>
  biubiubiu01:50070</value>
  </property>

 dfs.namenode.http-address.mycluster.NN2</name>
  biubiubiu02:50070</value>
  </property>


 dfs.namenode.shared.edits.dir</name>
  qjournal://biubiubiu01:8485;biubiubiu02:8485;biubiubiu03:8485/mycluster</value>
</property>

  dfs.journalnode.edits.dir</name>
  /opt/model/hadoop_data/dfs/jndata</value>
</property>


 dfs.client.failover.proxy.provider.mycluster</name>
 org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>


 dfs.ha.fencing.methods</name>
  sshfence</value>
  </property>

 dfs.ha.fencing.ssh.private-key-files</name>
  /home/hadoop01/.ssh/id_rsa</value>
</property>


 dfs.namenode.edits.dir</name>
  /opt/model/hadoop_data/dfs/edits</value>
  </property>

 dfs.ha.automatic-failover.enabled</name>
  true</value>
</property>
</configuration>

四、HDFS-HA 集群配置

1、配置HDFS-HA集群

  1. 配置 core-site.xml

<!-- 把两个 NameNode的地址组装成一个集群 mycluster -->

fs.defaultFS</name>
hdfs://mycluster</value>
</property>
<!-- 指定 hadoop 运行时产生文件的存储目录 -->

hadoop.tmp.dir</name>
/opt/model/hadoop-2.7.2/hadoop_data/tmp</value>
</property>
</configuration>
  1. 配置 hdfs-site.xml

<!-- 完全分布式集群名称 -->

dfs.nameservices</name>
mycluster</value>
</property>
<!-- 集群中 NameNode 节点都有哪些 -->

dfs.ha.namenodes.mycluster</name>
NN1,NN2</value>
</property>
<!-- NN1 的 RPC 通信地址 -->

dfs.namenode.rpc-address.mycluster.NN1</name>
biubiubiu01:9000</value>
</property>
<!-- NN2 的 RPC 通信地址 -->

dfs.namenode.rpc-address.mycluster.NN2</name>
biubiubiu02:9000</value>
</property>
<!-- NN1 的 http 通信地址 -->

dfs.namenode.http-address.mycluster.NN1</name>
biubiubiu01:50070</value>
</property>
<!-- NN2 的 http 通信地址 -->

dfs.namenode.http-address.mycluster.NN2</name>
biubiubiu02:50070</value>
</property>
<!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->

dfs.namenode.shared.edits.dir</name>
qjournal://biubiubiu01:8485;biubiubiu02:8485;biubiubiu03:8485/mycluster</value>
</property>
<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->

dfs.ha.fencing.methods</name>
sshfence</value>
</property>
<!-- 使用隔离机制时需要 ssh 无秘钥登录-->

dfs.ha.fencing.ssh.private-key-files</name>
/home/hadoop01/.ssh/id_rsa</value>
</property>
<!-- 声明 journalnode 服务器存储目录-->

dfs.journalnode.edits.dir</name>
/opt/model/hadoop_data/dfs/jndata</value>
</property>
<!-- 关闭权限检查-->

dfs.permissions.enable</name>
false</value>
</property>
<!-- 访问代理类:client,mycluster,active 配置失败自动切换实现方式-->

dfs.client.failover.proxy.provider.mycluster</name>
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</
value>
</property>
</configuration>

scp分发到其他节点机器。

2、配置 HDFS-HA 自动故障转移

  1. 在 hdfs-site.xml 中增加

dfs.ha.automatic-failover.enabled</name>
true</value>
</property>
  1. 在 core-site.xml 文件中增加

ha.zookeeper.quorum</name>
biubiubiu01:2181,biubiubiu02:2181,biubiubiu03:2181</value>
</property>

五、YARN-HA 配置

1、YARN-HA 工作机制

官方文档:
http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html

YARN-HA 工作机制:
Hadoop-HA高可用分布式集群总结_第4张图片

2、配置 YARN-HA 集群

规划如上,配置rm在3、4台机器上。

修改yarn-site.xml



yarn.nodemanager.aux-services</name>
mapreduce_shuffle</value>
</property>
<!--启用 resourcemanager ha-->

yarn.resourcemanager.ha.enabled</name>
true</value>
</property>
<!--声明两台 resourcemanager 的地址-->

yarn.resourcemanager.cluster-id</name>
cluster-yarn1</value>
</property>

yarn.resourcemanager.ha.rm-ids</name>
rm1,rm2</value>
</property>

yarn.resourcemanager.hostname.rm1</name>
biubiubiu03</value>
</property>

yarn.resourcemanager.hostname.rm2</name>
biubiubiu04</value>
</property>
<!--指定 zookeeper 集群的地址-->

yarn.resourcemanager.zk-address</name>
biubiubiu01:2181,biubiubiu02:2181,biubiubiu03:2181</value>
</property>
<!--启用自动恢复-->

yarn.resourcemanager.recovery.enabled</name>
true</value>
</property>
<!--指定 resourcemanager 的状态信息存储在 zookeeper 集群-->

yarn.resourcemanager.store.class</name>
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore<
/value>
</property>
</configuration>

scp分发到其他节点机器。

六、整体启动

1、启动zookeeper

# 在biubiubiu01 、biubiubiu02 、biubiubiu03 分别启动zookeeper
[hadoop01@biubiubiu01 model]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

[hadoop01@biubiubiu02 data]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

[hadoop01@biubiubiu03 data]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

# 分别jsp
[hadoop01@biubiubiu01 model]$ jps
3361 Jps
3318 QuorumPeerMain

2、启动journalnode

# 在biubiubiu01 、biubiubiu02 、biubiubiu03 分别启动journalnode
[hadoop01@biubiubiu01 hadoop]$ hadoop-daemon.sh start journalnode
[hadoop01@biubiubiu02 hadoop]$ hadoop-daemon.sh start journalnode
[hadoop01@biubiubiu03 hadoop]$ hadoop-daemon.sh start journalnode

# jps查看进程
[hadoopenv@os1 hadoop]$ jps
2041 JournalNode
3361 Jps
3318 QuorumPeerMain

3、格式化namenode

# 仅仅在biubiubiu01上格式化一次
[hadoop01@biubiubiu01 hadoop]$ hdfs namenode -format
# 复制biubiubiu01上的namenode的元数据到第二台biubiubiu02
[hadoop01@biubiubiu01 hadoop_data]$ scp -r /opt/model/hadoop_data biubiubiu02:/opt/model

4、格式化zkfc

# 在namenode节点(biubiubiu01、biubiubiu02)格式化zkfc
[hadoop01@biubiubiu01 hadoop_data]$ hdfs zkfc -formatZK
[hadoop01@biubiubiu02 hadoop_data]$ hdfs zkfc -formatZK

5、启动dfs

# biubiubiu01 启动dfs
[hadoop01@biubiubiu01 model]$ start-dfs.sh
Starting namenodes on [biubiubiu01 biubiubiu02]
biubiubiu02: starting namenode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-namenode-biubiubiu02.out
biubiubiu01: starting namenode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-namenode-biubiubiu01.out
biubiubiu02: starting datanode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-datanode-biubiubiu02.out
biubiubiu01: starting datanode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-datanode-biubiubiu01.out
biubiubiu03: starting datanode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-datanode-biubiubiu03.out
biubiubiu04: starting datanode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-datanode-biubiubiu04.out

Starting journal nodes [biubiubiu01 biubiubiu02 biubiubiu03]
biubiubiu01: journalnode running as process 2019. Stop it first.
biubiubiu03: journalnode running as process 1927. Stop it first.
biubiubiu02: journalnode running as process 1916. Stop it first.

Starting ZK Failover Controllers on NN hosts [biubiubiu01 biubiubiu02]
biubiubiu01: starting zkfc, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-zkfc-biubiubiu01.out
biubiubiu02: starting zkfc, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-zkfc-biubiubiu02.out


# 分别jps查看进程效果
[hadoop01@biubiubiu01 model]$ jps
2305 NameNode
2019 JournalNode
2888 Jps
2777 DFSZKFailoverController
2458 DataNode
1916 QuorumPeerMain

[hadoop01@biubiubiu02 model]$ jps
2321 DFSZKFailoverController
2435 Jps
2071 NameNode
2185 DataNode
1819 QuorumPeerMain
1916 JournalNode

[hadoop01@biubiubiu03 model]$ jps
2032 DataNode
2177 Jps
1927 JournalNode
1822 QuorumPeerMain

[hadoop01@biubiubiu04 model]$ jps
1742 DataNode
1855 Jps

6、查看namenode的状态

[hadoop01@biubiubiu01 model]$ hdfs haadmin -getServiceState NN1
active
[hadoop01@biubiubiu02 model]$ hdfs haadmin -getServiceState NN2
standby

Hadoop-HA高可用分布式集群总结_第5张图片
Hadoop-HA高可用分布式集群总结_第6张图片

7、启动yarn

# 在biubiubiu01 启动yarn
[hadoop01@biubiubiu01 sbin]$ start-yarn.sh 
starting yarn daemons
starting resourcemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-resourcemanager-biubiubiu01.out
biubiubiu04: starting nodemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-nodemanager-biubiubiu04.out
biubiubiu01: starting nodemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-nodemanager-biubiubiu01.out
biubiubiu02: starting nodemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-nodemanager-biubiubiu02.out
biubiubiu03: starting nodemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-nodemanager-biubiubiu03.out

# 在biubiubiu03、biubiubiu04上启动resourcemanager
[hadoop01@biubiubiu03 model]$ yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-resourcemanager-biubiubiu03.out

[hadoop01@biubiubiu03 model]$ jps
2032 DataNode
2416 ResourceManager
1927 JournalNode
2458 Jps
2269 NodeManager
1822 QuorumPeerMain

[hadoop01@biubiubiu04 model]$ yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-resourcemanager-biubiubiu04.out

[hadoop01@biubiubiu04 model]$ jps
1907 NodeManager
2044 ResourceManager
1742 DataNode
2078 Jps

8、查看resourcemanager的状态

[hadoop01@biubiubiu01 sbin]$ yarn rmadmin -getServiceState RM1
standby
[hadoop01@biubiubiu01 sbin]$ yarn rmadmin -getServiceState RM2
active

Hadoop-HA高可用分布式集群总结_第7张图片

9、注意

有很多人测试说,启动了两个NameNode,一个active,一个standby,如果将avtive的手动杀死(kill -9 端口号),不会立刻将standby的切换为active,需要重启才行?

这是因为NameNode节点机器中没有安装psmisc,导致fuser这个命令找不到,所以不能自动切换。
此时需要在NameNode节点机器中安装一下就可以了。

sudo yum install -y psmisc

七、HDFS Federation 架构设计

1、NameNode 架构的局限性

  1. Namespace(命名空间)的限制
    由于 NameNode 在内存中存储所有的元数据(metadata),因此单个 namenode 所能存储的对象(文件+块)数目受到 namenode 所在 JVM 的 heap size 的限制。50G 的 heap 能够存储 20 亿(200million)个对象,这 20 亿个对象支持 4000 个 datanode,12PB 的存储(假设文件平均大小为 40MB)。随着数据的飞速增长,存储的需求也随之增长。单个 datanode 从4T增长到 36T,集群的尺寸增长到 8000 个 datanode。存储的需求从 12PB 增长到大于100PB。
  2. 隔离问题
    由于 HDFS 仅有一个 namenode,无法隔离各个程序,因此 HDFS 上的一个实验程序就很有可能影响整个 HDFS 上运行的程序。
  3. 性能的瓶颈
    由于是单个 namenode 的 HDFS 架构,因此整个 HDFS 文件系统的吞吐量受限于单个namenode 的吞吐量。

2、HDFS Federation 架构设计

能不能有多个 NameNode
NameNode NameNode NameNode
元数据 元数据 元数据
Log machine 电商数据/话单数据

Hadoop-HA高可用分布式集群总结_第8张图片

3、HDFS Federation 应用思考

不同应用可以使用不同 NameNode 进行数据管理

  • 图片业务、爬虫业务、日志审计业务

Hadoop 生态系统中,不同的框架使用不同的 namenode 进行管理 namespace。(隔离性)

觉得有帮助的,请多多支持博主,点赞关注哦~

你可能感兴趣的:(大数据BigData)