HDFS架构与原理

HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,可以运行于廉价的商用服务器上。

一、HDFS优缺点

1.1 优点

1、高容错性

  • 数据自动保存多个副本。它通过增加副本的形式,提高容错性。
  • 某一个副本丢失以后,它可以自动恢复,这是由 HDFS 内部机制实现的,我们不必关心。

2、适合批处理

  • 它是通过移动计算而不是移动数据。
  • 它会把数据位置暴露给计算框架。

3、适合大数据处理

  • 处理数据达到 GB、TB、甚至PB级别的数据。
  • 能够处理百万规模以上的文件数量,数量相当之大。
  • 能够处理10K节点的规模。

4、流式文件访问

  • 一次写入,多次读取。文件一旦写入不能修改,只能追加。
  • 它能保证数据的一致性。

5、可构建在廉价机器上


1.2 缺点

1、访问延时较高

  • 比如毫秒级的来存储数据,这是不行的,它做不到。
  • 它适合高吞吐率的场景,就是在某一时间内写入大量的数据。但是它在低延时的情况下是不行的,比如毫秒级以内读取数据,这样它是很难做到的。

2、不合适小文件存储

  • 存储大量小文件(这里的小文件是指小于HDFS系统的Block大小的文件(默认64M))的话,它会占用 NameNode大量的内存来存储文件、目录和块信息。这样是不可取的,因为NameNode的内存总是有限的。
  • 小文件存储的寻道时间会超过读取时间,它违反了HDFS的设计目标。

3、不支持并发写

  • 一个文件只能有一个写,不允许多个线程同时写。

4、不支持随机写

  • 仅支持数据 append(追加),不支持文件的随机修改。

二、架构

这里写图片描述

1、Client:就是客户端。

  • 文件切分。文件上传 HDFS 的时候,Client 将文件切分成 一个一个的Block,然后进行存储。
  • 与 NameNode 交互,获取文件的位置信息。
  • 与 DataNode 交互,读取或者写入数据。
  • Client 提供一些命令来管理 HDFS,比如启动或者关闭HDFS。
  • Client 可以通过一些命令来访问 HDFS。

2、NameNode:就是 master,它是一个主管、管理者。

  • 管理 HDFS 的名称空间
  • 管理数据块(Block)映射信息
  • 配置副本策略
  • 处理客户端读写请求。

3、DataNode:就是Slave。NameNode 下达命令,DataNode 执行实际的操作。

  • 存储实际的数据块。
  • 执行数据块的读/写操作。

4、Secondary NameNode:并非 NameNode 的热备。当NameNode 挂掉的时候,它并不能马上替换 NameNode 并提供服务。详细的会单独分一个章节介绍。

  • 辅助 NameNode,分担其工作量。
  • 定期合并 fsimage和fsedits,并推送给NameNode。
  • 在紧急情况下,可辅助恢复 NameNode。

三、文件读写流程

3.1 HDFS读流程

这里写图片描述

(1)Client通过 RPC 调用向 NameNode 发送block locations请求,获得文件的第一批block的 locations。同一个block按照副本数会返回多个location,这些location按照Hadoop拓扑结构排序,距离客户端近的排在前面。

block1:node1,node2,node3 
block2:node2,node3,node4 
block3:node4,mode5,node6 
block4:node5,node6.node7

(2)客户端开始读block1,它会从locations里选择排在第一位的DataNode,也就是离客户端最近的datanode 并与之连接。

(3)客户端向该DataNode读取block1。以此类推读block2到block4.

(4)如果第一批block都读完了, 客户端就会去NameNode拿下一批block的locations,然后继续读,如果所有的块都读完,这时就会关闭掉所有的流。

-

容错机制:

(a)如果在从DataNode读数据的时候发生异常,比如DataNode宕机,则Client会尝试读下一个副本,也就是与另一个DataNode建立连接。并记录故障DataNode的ID,读取其他Block时直接跳过这个DataNode。

(b)Client会检查block**数据校验和**,如果发现一个坏的block,就会先报告到namenode节点,再去读其他副本。


3.2 HDFS写流程

这里写图片描述

(1)客户端在向NameNode请求之前先写入文件数据到本地文件系统的一个临时文件

(2)待临时文件达到块大小时开始向NameNode请求分配DataNode

(3)NameNode在文件系统中创建文件并返回给客户端这个block对应DataNode的地址列表(列表中包含副本存放的地址),这个列表中的DataNode会组成一道流水线。

(4)客户端把Block写到第一个DataNode,这个DataNode会将数据库复制到第二DataNode,以此类推,是为流水线。

(5)当文件全部写完,NameNode会提交这次文件创建,此时,文件在文件系统中可见。

-

容错机制:

如果在写的过程中一个DataNode宕机,那么些流程会选择剩下的列表中的DataNode,并且上报给NameNode,一个DataNode出现故障,由NameNode来选择新的DataNode补充一个副本。


四、Hadoop2.x新特性

4.1 NameNode Federation

这里写图片描述

特点:

  • 存在多个NameNode,每个NameNode分管一部分目录。
  • NameNode共用DataNode。

好处:

(1)解决内存扩展问题:当NameNode内存受限时,能扩展内存。

(2)容错能力:每个NameNode独立工作相互不受影响,比如其中一个NameNode挂掉啦,它不会影响其他NameNode提供服务,但我们需要注意的是,虽然有多个NameNode,分管不同的目录,但是对于特定的NameNode,依然存在单点故障,因为没有它没有热备,解决单点故障使用NameNode HA。


4.2 NameNode HA

其中一种方案是:基于NFS共享存储。Active NameNode与Standby NameNode通过NFS实现共享数据,但如果Active NameNode与NFS之间或Standby NameNode与NFS之间,其中一处有网络故障的话,那就会造成数据同步问题。


五、HDFS的其他特性

5.1 HDFS 副本存放策略

这里写图片描述

注:“同Client的节点上”是指Client正好运行在一个DataNode上


5.2 Secondary NameNode

在初学Hadoop时,有个让人疑惑的概念:Secondary NameNode,也叫辅助namenode。从命名看,好像是第二个namenode,用于备份主namenode,在主namenode失败后启动。那么,Secondary NameNode的作用是什么?是如何工作的?

5.2.1 NameNode

HDFS集群有两类节点以管理者和工作者的工作模式运行,namenode就是其中的管理者。它管理着文件系统的命名空间,维护着文件系统树及整棵树的所有文件和目录。这些信息以两个文件的形式保存于内存或者磁盘,这两个文件是:命名空间镜像文件fsimage和编辑日志文件edit logs ,同时namenode也记录着每个文件中各个块所在的数据节点信息。

namenode对元数据的操作过程
这里写图片描述
图中有两个文件:
(1)fsimage:文件系统映射文件,也是元数据的镜像文件(磁盘中),存储某段时间namenode内存元数据信息。
(2)edits log:操作日志文件。
这种工作方式的特点:
(1)namenode始终在内存中存储元数据(metedata),使得“读操作”更加快、
(2)有“写请求”时,向edits文件写入日志,成功返回后才修改内存,并向客户端返回。
(3)fsimage文件为metedata的镜像,不会随时同步,与edits合并生成新的fsimage。

从以上特点可以知道,edits文件会在集群运行的过程中不断增多,占用更多的存储空间,虽然有合并,但是只有在namenode重启时才会进行。并且在实际工作环境很少重启namenode,
这就带来了一下问题:
(1)edits文件不断增大,如何存储和管理?
(2)因为需要合并大量的edits文件生成fsimage,导致namenode重启时间过长。
(3)一旦namenode宕机,用于恢复的fsiamge数据很旧,会造成大量数据的丢失。


5.2.2 Secondary NameNode

上述问题的解决方案就是运行辅助namenode–Secondary NameNode,为主namenode内存中的文件系统元数据创建检查点,Secondary NameNode所做的不过是在文件系统中设置一个检查点来帮助NameNode更好的工作。它不是要取代掉NameNode也不是NameNode的备份,
SecondaryNameNode有两个作用,一是镜像备份,二是日志与镜像的定期合并。两个过程同时进行,称为checkpoint(检查点)。
镜像备份的作用:备份fsimage(fsimage是元数据发送检查点时写入文件);
日志与镜像的定期合并的作用:将Namenode中edits日志和fsimage合并,防止如果Namenode节点故障,namenode下次启动的时候,会把fsimage加载到内存中,应用edits log,edits log往往很大,导致操作往往很耗时。(这也是namenode容错的一套机制)

Secondary NameNode创建检查点过程
这里写图片描述

Secondarynamenode工作过程
(1)SecondaryNameNode通知NameNode准备提交edits文件,此时主节点将新的写操作数据记录到一个新的文件edits.new中。
(2)SecondaryNameNode通过HTTP GET方式获取NameNode的fsimage与edits文件(在SecondaryNameNode的current同级目录下可见到 temp.check-point或者previous-checkpoint目录,这些目录中存储着从namenode拷贝来的镜像文件)。
(3)SecondaryNameNode开始合并获取的上述两个文件,产生一个新的fsimage文件fsimage.ckpt。
(4)SecondaryNameNode用HTTP POST方式发送fsimage.ckpt至NameNode。
(5)NameNode将fsimage.ckpt与edits.new文件分别重命名为fsimage与edits,然后更新fstime,整个checkpoint过程到此结束。
SecondaryNameNode备份由三个参数控制fs.checkpoint.period控制周期(以秒为单位,默认3600秒),fs.checkpoint.size控制日志文件超过多少大小时合并(以字节为单位,默认64M), dfs.http.address表示http地址,这个参数在SecondaryNameNode为单独节点时需要设置。

从工作过程可以看出,SecondaryNameNode的重要作用是定期通过编辑日志文件合并命名空间镜像,以防止编辑日志文件过大。SecondaryNameNode一般要在另一台机器上运行,因为它需要占用大量的CPU时间与namenode相同容量的内存才可以进行合并操作。它会保存合并后的命名空间镜像的副本,并在namenode发生故障时启用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值