HDFS文件读取、写入过程详解

HDFS架构

-----------------------------

运行在廉价的硬件之上的、成本较低的、访问大型数据集、具有容错的特性、容错机制。HDFS是master/slaves架构,由一个名称节点以及多个数据节点构成。namenode负责namespace管理以及client的访问。内部文件被切块存储在数据节点的集合中。

  HDFS文件读取、写入过程详解_第1张图片
NameNode(元数据节点)存放元数据(名称空间、副本数、权限、块列表、集群配置信息...),不包含数据节点。元数据节点将文件系统元数据存储在内存中。
DataNode(数据节点):真正存储数据的地方,以数据块为单位。默认数据块大小为128M。数据节点周期性的将所有存储块信息发送给元数据节点。客户端通过和NameNode节点沟通后,再向数据节点对数据读出或写入。
SecondaryNameNode(从元数据节点):并不是元数据节点的备用节点,而是配合元数据节点工作,与元数据节点有不同的工作。SecondaryNameNode周期性地将元数据节点的命名空间镜像文件和修改日志合并,帮助元数据节点将内存中元数据信息存储到磁盘上。

Client(客户端):客户端就是需要获取HDFS系统中文件的应用程序和接口,引发HDFS的读/写等操作。



文件读取过程

-------------------------

HDFS文件读取、写入过程详解_第2张图片

 

详细过程:

1.客户端(Client)调用FileSystem的open()函数打开文件。

2.DistributeFileSystem通过RPC调用元数据节点,得到文件的数据块信息。对于每一个数据块,元数据节点返回数据块的数据节点位置。

3.DistributedFileSystem返回FSDataInputStream给客户端,用来读取数据。客户端调用stream的read()方法读取数据。

4.FSDataInputStream连接保存此文件第一个数据块的最近的数据节点,Data从数据节点读到客户端(Client)。

5.当此数据块读取完毕后,FSDataInputStream关闭和此数据节点的连接,然后读取保存下一个数据块的最近的数据节点。

6.当数据读取完毕后,调用FSDataInputStream的close()函数。

7.在数据读取过程中,如果客户端在与数据节点通信时出现错误,则会尝试读取包含有此数据块的下一个数据节点,并且失败的数据节点会被记录,以后不会再连接。



文件写入过程

----------------------

HDFS文件读取、写入过程详解_第3张图片

详细过程:

1.客户端调用create()函数创建文件。

2.DistributedFileSystem通过RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件。元数据节点会首先确定文件原先不存在,并且客户端有创建文件的权限,然后创建新文件。

3.DistributedFileSystem返回FSDataOutputStream,客户端用于写数据。

4.FSDataOutputStream将数据分成块,写入Data Queue。Data Queue由Data Streamer读取,并通知元数据节点分配数据节点用来存储数据块(每块默认复制3份)。分配的数据节点放在一个Pipeline中。Data Streamer将数据块写入Pipeline中的第一个数据节点;第一个数据节点再将数据块发送给第二个数据节点;第二个数据节点再将数据发送给第三个数据节点。

5.FSDataoutputStream为发出去的数据块保存了ACK Queue,等待Pipeline中的数据节点告知数据已成功写入。如果数据节点在写入过程中失败了,则关闭Pipeline,将Ack Queue中的数据块放入到Data Queue的开始。

6.当前数据块在已经写入的数据节点中会被元数据节点赋予新的标识,则错误节点重启后能察觉到其数据块是过时的,将会被删除。失败的数据节点从Pipeline中移除,另外的数据块则写入Pipeline中的另外两个数据节点。元数据节点则被通知此数据块复制块数不足,将来会再创建第三份备份。

7.当客户端结束写入数据后,则调用stream的close()方法。此操作将所有的数据块写入pipeline中的数据节点,并等待ACK Queue成功返回。最后通知元数据节点写入完毕。

你可能感兴趣的:(hadoop)