HDFS容错机制

概述

最近看各种分布式组件的容错机制看得有点晕,所以打算理一理,类比学习一下。本篇博文就对HDFS的容错进行简单归纳。如有错误,敬请指出。
Hadoop的两个重要组件是MapReduce和HDFS,一个提供分布式计算能力,一个提供分布式存储能力。HDFS可以通过廉价机器搭建大规模集群,获得海量数据的分布式存储能力。对于廉价机器而言,出现网络故障、节点失效、数据损坏现象的频率并不低,所以在故障之后如何进行数据恢复和容错处理是至关重要的,HDFS提供了完善的容错机制,使得它成为一个高度容错性和高吞吐量的海量数据存储解决方案。

故障检测机制

故障的类型主要有以下三种,针对这三种故障类型,HDFS提供了不同的故障检测机制:

  1. 针对DataNode失效问题,HDFS使用了心跳机制,DataNode定期向NameNode发送心跳信息,NameNode根据心跳信息判断DataNode是否存活;
  2. 针对网络故障而导致无法收发数据的问题,HDFS提供了ACK的机制,在发送端发送数据后,如果没有收到ACK并且经过多次重试后仍然如此,则认为网络故障;
  3. 针对数据损坏问题,所有DataNode会定期向NameNode发送自身存储的块清单,在传输数据的同时会发送总和校验码,NameNode依次来判断数据是否丢失或损坏。

容错机制

读容错

由于在读HDFS的过程中会从NameNode获取到数据块位置列表,如果某个DataNode失效,换个DataNode读即可。

写容错

写HDFS的过程中会对多个DataNode建立管道进行写入,如果数据发送者没有收到其中某个DataNode的ACK,则认为该DataNode失效,会跳过该DataNode并将数据写入剩余DataNode。NameNode收集DataNode信息时发现文件的副本数与设置值不一致,会重新寻找一个DataNode保存副本。

DataNode失效

在NameNode中会持有数据块表和DataNode两张表。数据块表存储着某个数据块(包括副本)所在的DataNode,DataNode表存储着每个DataNode中保存的数据块列表。由于DataNode会周期性地给NameNode发送自己所持有的数据块信息,因此NameNode会持续更新数据块表和DataNode表。如果发现某个DataNode上的数据块错误,NameNode会从数据块表删除该数据块;如果发现某个DataNode失效,NameNode会对两张表进行更新。NameNode还会周期性地扫描数据块表,如果发现数据块表中某个数据库的备份数量低于所设置的备份数,则会协调从其它DataNode复制数据到另一个DataNode上完成备份。

HDFS副本放置策略

HDFS对于读写的容错机制都基于HDFS的副本机制,只要HDFS尚存一个有效的数据副本,就依然能够正常工作。而HDFS采用尽量灵活的副本放置策略,使得它的可靠性更强。
如果写请求出现在某个DataNode上,第一个副本就会存放在当前DataNode所在的机器上,如果该机器负载过重,可以将该备份放在同一个机架上的随机机器上。接着第二个副本就会存放在不同于第一个副本所在机架的机架上,第三个副本会随机存放在第二个副本所在机架的任一DataNode上。
简单来说,在三个副本的情况下,第一个副本与原数据在相同机器上,另外两个副本放在其它机架的随机机器上。这样的设置可以使得性能与容灾兼备,优先从同机器上获取备份数据,减少数据传输开销;在该机器宕机的情况下,从另一个机架获取备份数据,避免同一个机架的机器集体宕机的情况出现。

HDFS的HA架构

以上的所有容错都是基于DataNode的故障问题进行考虑的,但是NameNode本身就存在单点故障,如果NameNode出现故障,则整个集群会直接宕机。因此HDFS提供了HA的架构,对于一个典型的HA集群而言,NameNode会被配置在两台独立的机器上,在任何时间上,一个NameNode处于Active状态,而另一个NameNode处于Standby状态,Active状态的NameNode会响应集群中所有的客户端的请求,Standby状态的NameNode只是作为一个副本,保证在必要的时候提供一个快速的转移,使得上层对NameNode的切换无感知,Standby NameNode与Active NameNode应时刻保持同步,在Active NameNode和Standby NameNode之间要有个共享的存储日志的地方,Active NameNode把EditLog写到共享的存储日志中,Standby NameNode读取日志并执行,使得Active NameNode和Standby NameNode内存中的HDFS元数据保持同步。

附:HDFS读写简述

HDFS读过程:
1、Client访问NameNode,查询元数据信息,获得该文件的数据块位置列表;
2、就近选择一台DataNode服务器,Client与其建立输入流并从中读取数据。
HDFS写过程:
1、Client向NameNode发出写请求,NameNode会将数据更改写入EditLog(WAL机制);
2、Client按128M的块大小切分文件,并与可写的DataNode列表构成pipeline,将数据发送给最近的DataNode节点,Client每向第一个DataNode写入一个packet,该packet会通过pipeline向后分发;
3、当列表中的所有DataNode都写入完成后,向NameNode汇报。

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值