⼤数据⼊门(⼆)Hadoop分布式⽂件系统——HDFS简介⼀、HDFS是什么
Hadoop分布式⽂件系统(Hadoop Distributed File System,HDFS)是Hadoop项⽬的核⼼⼦项⽬,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超⼤⽂件的需求⽽开发的,可以运⾏于廉价的商⽤服务器上,具有⾼容错、⾼可靠性、⾼可扩展性、⾼吞吐率等特征,为超⼤数据集的应⽤处理带来了很多便利。HDFS不适合⽤在:要求低时间延迟数据访问的应⽤,存储⼤量的⼩⽂件,多⽤户写⼊或者任意修改⽂件的场景。
分布式计算(Distributed computing)是⼀种把需要进⾏⼤量计算的⼯程数据分割成⼩块,由多台计算机分别计算,在上传运算结果后,将结果统⼀合并得出数据结论的科学。
分布式⽂件系统(Distributed File System)是⽤来管理⽹络中跨多台计算机存储的⽂件系统。
流数据模式访问:HDFS采⽤ “⼀次写⼊,多次读取” 的⾼效的访问模式。数据集通常是由数据源⽣成或者从数据源复制⽽来,接着长时间在此数据集上进⾏各类分析,每次分析都涉及该数据集的⼤部分或者是全部,因此读取整个数据集的时间延迟⽐读取第⼀条记录的时间延迟更为重要。这⾥书上讲的⽐较晦涩,简单说明下。流式数据访问是来了⼀点数据就进⾏处理(举个例⼦,边下边播),⽽与之对应的⾮流式数据访问就是等数据全部就绪后,在进⾏处理(举个例⼦,下完在播)。
低时间延迟的数据访问:要求低时间延迟数据访问的应⽤,例如⼏⼗毫秒范围,不适合在HDFS上运⾏。记住,HDFS是为⾼数据吞吐量应⽤优化的,这可能会导致时间延迟提⾼。⽬前,对于低延迟的访问需求,HBase是更好的选择。
⼤量的⼩⽂件:⼩⽂件通常指⽂件⼤⼩要⽐HDFS块(Block)⼤⼩还要⼩很多的⽂件。如果存在⼤量⼩⽂件,则会对整个存储系统有⼀定影响:(1)由于namenode将⽂件系统的元数据存储在内存中,因此⼤量的⼩⽂件会耗尽namenode的内存,影响HDFS的⽂件存储量;(2)如果使⽤mapreduce处理⼩⽂件,则会增加map任务数量,增加寻址次数。
多⽤户写⼊,任意修改⽂件:HDFS中的⽂件写⼊只⽀持单个写⼊者,⽽且写操作总是以“只添加”⽅式在⽂件末尾写数据。它不⽀持多个写⼊者的操作,也不⽀持在⽂件的任意位置进⾏修改。
⼆、HDFS相关概念解析
1. Block(块):在操作系统中,每个磁盘都有默认的数据块⼤⼩,这是磁盘进⾏数据读/写的最⼩单位()。⽽HDFS同样也有块
(Block)的概念,但是⼤得多,默认为128MB(可通过dfs.blocksize设置)。与单⼀磁盘上的⽂件系统相似,HDFS上的⽂件也被划分成块⼤⼩的多个分块(Chunk),作为独⽴的存储单元。但与⾯向单⼀
磁盘的⽂件系统不同的是,HDFS中⼩于⼀个块⼤⼩的⽂件不会占据整个块的空间。例如,⼀个1MB的⽂件存储在⼀个128MB的块中时,⽂件只使⽤1MB的磁盘空间,⽽不是128MB(扩展:)。注意:⽂件块越⼤,寻址时间越短,但磁盘传输时间越长;⽂件块越⼩,寻址时间越长,但磁盘传输时间越短。
2. Namenode(管理节点):⽤来管理⽂件系统的命名空间(namespace),它维护着⽂件系统树及整棵树内所有的⽂件和⽬录。这
些信息以两个⽂件形式永久保存在本地磁盘上:命名空间镜像⽂件(FSImage)和编辑⽇志⽂件(Editlog)。namenode也记录着每个⽂件中各个块所在的数据节点信息,但它并不永久保存块的位置信息,因为这些信息会在系统启动时根据数据节点信息重建。
1. FSImage(命名空间镜像⽂件):FSImage保存了最新的元数据检查点,在HDFS启动时会加载FSImage的信息,包含了整个HDFS
⽂件系统的所有⽬录和⽂件的信息。 对于⽂件来说这包括了数据块描述信息、修改时间、访问时间等;对于⽬录来说包括修改时间、访问权限控制信息(⽬录所属⽤户,所在组)等。fsimage⽂件,⼀般以fsimage_为前缀进⾏存储。
2. Editlogs(编辑⽇志⽂件):Editlogs主要是在NameNode已经启动情况下对HDFS进⾏的各种更新操作进⾏记录,HDFS客户端执
⾏所有的写操作都会被记录到Editlogs中。edit logs⽂件,⼀般以edits_为前缀进⾏存储。FSImage与Editlogs⽂件均存储
在${dfs.namenode.name.dir}/current/路径下。
3. Datanode(数据节点):是⽂件系统的⼯作节点,是实际存储数据的节点。它们根据需要存储并检索数据块(受客户端或
namenode调度),并且定期向namenode发送它们所存储的块的列表。
4. Secondary Namenode(辅助节点/检查节点):因为NameNode是通过“FSImage + Editlogs”来存储元数据的,⽽edit logs只
有在NameNode重启时,才会合并到fsimage中,从⽽得到⼀个⽂件系统的最新快照(检查点 checkpoint:将edit log⽂件合并到fsimage⽂件,该合并过程叫做checkpoint)。但是在⽣产环境中NameNode是很少重启的,这也意味着当NameNode运⾏了很长时间后,edit logs⽂件会变得很⼤,这就会导致⼀些问题,⽐如必要时重启namenode(如namenode宕机重启)会花费许多时间(需要将Editlogs合并到FSImage中)。为了解决这个问题,我们需要⼀个易于管理的机制来帮助我们减⼩edit logs⽂件的⼤⼩和得到⼀个最新的fsimage⽂件,这样也会减⼩在NameNode上的压⼒。这跟Windows的恢复点是⾮常像的,Windows的恢复点机制允许我们对OS进⾏快照,这样当系统发⽣问题时,我们能够回滚到最新的⼀次恢复点上。Secondary Namenode就是来帮助解决上述问题的,它会定时(默认1⼩时,可通过dfs.namenode.checkpoint.period修改;⽽dfs.s,默认设置为1百万,是⽤来定义NameNode上的未经检查的事务的数量,这将强制紧急检查点,即使尚未达到检查点周期)从Namenode上获取FSImage和Edits并进⾏合并,然后再把最新的FSImage发送给namenode。
HDFS采⽤master/slave主从架构。⼀个HDFS集由⼀个NameNode和⼀定数量的DataNode组成。
三、HDFS⽂件写⼊流程
如上图所⽰,HDFS分布在三个机架上Rack1,Rack2,Rack3。
此时假设有⼀个⽂件FileA,⼤⼩为100MB,⽽HDFS的块⼤⼩为64MB。
a. Client向NameNode发送写数据请求,如上图蓝⾊虚线①
b. NameNode根据⽂件⼤⼩和⽂件块配置情况,将FileA按64MB分块成Block1和Block2;
c. NameNode节点根据DataNode的地址信息以及机架感知(rack-aware)策略返回可⽤的DataNode,如粉⾊虚线②。扩展:
注:HDFS采⽤⼀种称为机架感知(rack-aware)的策略来改进数据的可靠性、可⽤性和⽹络带宽的利⽤率。默认情况下,副本系数是
3(可通过plication进⾏修改)。HDFS的存放策略是将⼀个副本存放在本地机架的节点上,⼀个副本存放在同⼀机架的另⼀个节点上,最后⼀个副本存放在不同机架的节点上。这种策略减少了机架间的数据传输,提⾼了写操作的效率。机架的错误远远⽐节点的错误少,所以这种策略并不会影响到数据的可靠性和可⽤性。与此同时,因为数据块只存放在两个(不是三个)不同的机架上,所以此策略减少了读取数据时需要的⽹络传输总带宽。
因此,返回的DataNode信息如下:⽹络拓扑上的就近原则,如果都⼀样,则随机挑选⼀台DataNode
Block1: host2,host1,host3
Block2: host7,host8,host4
d. client向DataNode发送Block1;发送过程是以流式写⼊。 流式写⼊过程如下:
1>将64MB的Block1按64KB的package划分;
2>然后将第⼀个package发送给host2;
3>host2接收完后,将第⼀个package发送给host1,同时client向host2发送第⼆个package;
4>host1接收完第⼀个package后,发送给host3,同时接收host2发来的第⼆个package。
5>以此类推,如图红线实线所⽰,直到将block1发送完毕。
6>host2,host1,host3向NameNode,host2向Client发送通知,说“消息发送完了”。如图粉红颜⾊实线所⽰。
7>client收到host2发来的消息后,向namenode发送消息,说我写完了。这样就真完成了。如图黄⾊粗实线
8>发送完block1后,再向host7,host8,host4发送block2,如图蓝⾊实线所⽰。
hadoop分布式集搭建9>发送完block2后,host7,host8,host4向NameNode,host7向Client发送通知,如图浅绿⾊实线所⽰。
10>client向NameNode发送消息,说我写完了,如图黄⾊粗实线。这样就完毕了。
四、HDFS⽂件读取流程
读操作相对简单,如上图所⽰,FileA由block1和block2组成。此时client从DataNode读取FileA流程如下:
a. client向namenode发送读请求。
b. namenode查看Metadata元数据信息,返回FileA的block的位置。
Block1: host2,host1,host3
Block2: host7,host8,host4
c. block的位置是有先后顺序的,先读block1,再读block2。⽽且block1去host2上读取;然后block2,去host7上读取;
上⾯例⼦中,client位于机架外,那么如果client位于机架内某个DataNode上,例如,client是host6。那么读取的时候,遵循的规律是:优选读取本机架上的数据。
五、结语
HDFS的读写流程感觉这⾥写的还不是很透彻,在贴⼏个博客地址:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论