Hadoop之HDFS原理与操做

HDFS原理

HDFSHadoop Distributed File System)是一个分布式文件系统,是谷歌的GFS山寨版本。它具备高容错性并提供了高吞吐量的数据访问,很是适合大规模数据集上的应用,它提供了一个高度容错性和高吞吐量的海量数据存储解决方案。 node

l高吞吐量访问:HDFS的每一个Block分布在不一样的Rack上,在用户访问时,HDFS会计算使用最近和访问量最小的服务器给用户提供。因为Block在不一样的Rack上都有备份,因此再也不是单数据访问,因此速度和效率是很是快的。另外HDFS能够并行从服务器集群中读写,增长了文件读写的访问带宽。 服务器

l高容错性:系统故障是不可避免的,如何作到故障以后的数据恢复和容错处理是相当重要的。HDFS经过多方面保证数据的可靠性,多份复制而且分布到物理位置的不一样服务器上,数据校验功能、后台的连续自检数据一致性功能都为高容错提供了可能。 架构

l线性扩展:由于HDFSBlock信息存放到NameNode上,文件的Block分布到DataNode上,当扩充的时候仅仅添加DataNode数量,系统能够在不中止服务的状况下作扩充,不须要人工干预。 分布式

HDFS架构

clip_image001[6]

如上图所示HDFSMasterSlave的结构,分为NameNodeSecondary NameNodeDataNode三种角色。 oop

lNameNode:在Hadoop1.X中只有一个Master节点,管理HDFS的名称空间和数据块映射信息、配置副本策略和处理客户端请求; spa

lSecondary NameNode:辅助NameNode,分担NameNode工做,按期合并fsimagefsedits并推送给NameNode,紧急状况下可辅助恢复NameNode 对象

lDataNodeSlave节点,实际存储数据、执行数据块的读写并汇报存储信息给NameNode blog

HDFS 读操做

clip_image003[6]

1.     客户端经过调用FileSystem对象的open()方法来打开但愿读取的文件,对于HDFS来讲,这个对象时分布文件系统的一个实例; 排序

2.     DistributedFileSystem经过使用RPC来调用NameNode以肯定文件起始块的位置,同一Block按照重复数会返回多个位置,这些位置按照Hadoop集群拓扑结构排序,距离客户端近的排在前面; 队列

3.     前两步会返回一个FSDataInputStream对象,该对象会被封装成DFSInputStream对象,DFSInputStream能够方便的管理datanodenamenode数据流,客户端对这个输入流调用read()方法;

4.     存储着文件起始块的DataNode地址的DFSInputStream随即链接距离最近的DataNode,经过对数据流反复调用read()方法,能够将数据从DataNode传输到客户端;

5.     到达块的末端时,DFSInputStream会关闭与该DataNode的链接,而后寻找下一个块的最佳DataNode,这些操做对客户端来讲是透明的,客户端的角度看来只是读一个持续不断的流;

6.     一旦客户端完成读取,就对FSDataInputStream调用close()方法关闭文件读取。

HDFS写操做

 

clip_image005[6]

1.     客户端经过调用DistributedFileSystemcreate()方法建立新文件;

2.     DistributedFileSystem经过RPC调用NameNode去建立一个没有Blocks关联的新文件,建立前NameNode会作各类校验,好比文件是否存在、客户端有无权限去建立等。若是校验经过,NameNode会为建立新文件记录一条记录,不然就会抛出IO异常;

3.     前两步结束后会返回FSDataOutputStream的对象,和读文件的时候类似,FSDataOutputStream被封装成DFSOutputStreamDFSOutputStream能够协调NameNodeDatanode。客户端开始写数据到DFSOutputStreamDFSOutputStream会把数据切成一个个小的数据包,并写入内部队列称为“数据队列”(Data Queue)

4.     DataStreamer会去处理接受Data Queue,它先问询NameNode这个新的Block最适合存储的在哪几个DataNode里,好比重复数是3,那么就找到3个最适合的DataNode,把他们排成一个pipeline.DataStreamerPacket按队列输出到管道的第一个Datanode中,第一个DataNode又把Packet输出到第二个DataNode中,以此类推;

5.     DFSOutputStream还有一个对列叫Ack Quene,也是有Packet组成,等待DataNode的收到响应,当Pipeline中的全部DataNode都表示已经收到的时候,这时Akc Quene才会把对应的Packet包移除掉;

6.     客户端完成写数据后调用close()方法关闭写入流;

7.     DataStreamer把剩余的包都刷到Pipeline里而后等待Ack信息,收到最后一个Ack后,通知NameNode把文件标示为已完成。

相关文章
相关标签/搜索