Riordon

  博客园 :: 首页 :: 新随笔 :: :: :: 管理 ::

HDFS工作原理浅析

问题导读:
1、设计HDFS是为了解决什么问题?
2、HDFS有哪些角色?各自的作用?
3、HDFS的读写流程是怎样的?
 
HDFS是一个分布式文件系统,主要用于海量数据的储存,并且稳定、可水平扩展。
HDFS基本构架图:
 
Namenode:负责管理元数据,包含文件目录、文件和block的对应关系,block和datanode的对应关系
Datanodes:存储真正的数据
SecondaryNameNode:定期spap一下namenode,记录namenode中的metadata及其它数据。
 
数据读取过程
 根据HDFS地址,客户端首先获取FileSystem的一个实例,也就是HDFS对应的实例。
(1) 客户端调用FileSystem实例的open方法,获取这个这个文件对应对应的输入流,在HDFS上就是DFSInputStream。
(2) 构造第一步的输入流DFSInputStream时,通过RPC远程调用NameNode可以获得NameNode中此文件对应数据块保存位置
     在输入流中会按照网络拓扑结构,根据与客户端距离对DataNode进行简单的排序。
(3~4) 获得输入流后,客户端调用read方法读取数据。输入流会根据前面的排序,选择最近的DataNode建立连接并读取数据。
    如果客户端和其中一个DataNode位于同一机器(比如MapReduce过程中的mapper和reducer),那么就直接从本地读取数据。 
(5) 如果已经达到了数据块末端,那么关闭与这个DataNode的连接,然后重新查找下一个数据块。
不断执行2~5步直到读完文件的所有数据块,然后调用close。
(6) 客户端调用close,关闭输入流DFSInputStream。

注:如果DFSInputStream和DataNode通信时遇到错误,或者数据校验出错,则DFSInputStream会重新连接次近的DataNode读取数据。

 
数据写入过程
根据HDFS地址,客户端首先获取FileSystem的一个实例,也就是HDFS对应的实例。
(1~2) 客户端调用FileSystem实例的create方法,创建文件。NameNode通过一些检查,比如文件是否存在,客户端是否拥有创建权限等;
     通过检查之后,在NameNode中添加文件信息。注意,因为这时的文件还没有数据,故NameNode上也没有文件数据块的信息。创建
     结束后,HDFS会返回输出流DFSOutputStream给客户端。
(3) 客户端调用输出流DFSOutputStream的write方法向对应的HDFS中对应的文件写数据。数据会首先拆包,这学分包会写入输出流的内部
     Data队列,接收完整数据分包后,输出流DFSOutputStream会向NameNode申请保存文件和副本数据块的若干个DataNode信息,这若
    干个DataNode会形成一个数据传输管道。
(4) DFSOutputStream会(根据网络拓扑结构排序)将数据传输给离自己最近的DataNode,这个DataNode接收到数据包后传递给下一个
     DataNode。数据在各个DataNode之间通过管道流动,而不是全部由输出流分发,减少了传输开销。
(5) 各个DataNode位于不同机器上,数据需要通过网络传输,为了保证数据的完整性,接收到数据的DataNode需要向发送者发送确认
     包(ACK Packet)。对于某个数据块,  只有当DFSOutputStream接收到了所有的DataNode的正确ACK,才能确认传输结束。DFSOutputStream
     内部专门维护了一个等待ACK队列,这一队列保存已经进入管道传输数据、但是并未被完全确认的数据包。
     不断执行3~5步直到数据全部写完,客户端调用close关闭文件。
(6) 客户端调用close方法,DFSOutputStream继续等待直到所有数据写入完毕并被确认,调用complete方法通知NameNode文件写入完成。
(7) NameNode接收到complete消息后,等待相应数量的副本写入完毕,告知客户端。
 
 博客迁移至:http://wangxiaolong.org/
 
 
 
posted on 2015-06-26 23:36  Riordon  阅读(519)  评论(1)    收藏  举报