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发生故障时启用。