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/
我喜欢一无所有,这样就只能一步一步的创造世界...

浙公网安备 33010602011771号