HDFS读流程和写流程图解

一、HDFS是什么

(1)三个进程

       1.  NameNode:管理文件系统的命名空间

       2.  DataNode:文件系统的工作节点

       3.  SecondaryNameNode:监控HDFS状态的辅助后台程序

      注:HSFS是以master/slave模式运行的,其中NameNode、SecondaryNameNode 运行在master节点,DataNode运行slave节点。

(2)数据块(block)和副本数(replica)

         数据块:在HDFS上,block(数据块)默认为128MB,但是小于一个块的文件不会占据整个块的空间,比如一个20MB的文件存储在128MB的块中间时,文件只使用20MB磁盘空间。

         修改数据块的大小:

         副本:在HDFS中,一般默认副本数为3,最大副本数为512。

         副本放置策略:在有3个副本的前提下,第一副本放在上传文件的DataNode上,如果是在集群外提交的,则会随机选择一台磁盘不满、CPU不忙的节点放置;第二副本则放置在与第一副本不同机架的DataNode上;第三副本与第二副本放置在同一机架上。


二、HDFS架构设计

       如下图:

        一个HDFS集群包含了一个NameNode和多个Datanode的,是主从架构模式,Datanode受Namenode的支配。Secondary Namanode则定期同步元数据映像文件和修改日志,做备份工作,防止 NameNode 发生故障时,元数据丢失,当 NameNode 发生故障时,用来恢复文件系统。

        在运行过程中,DataNode需要定期向NameNode发送心跳消息,来汇报自己的状况:是否还处于Active状态,网络是否断开之类的。


三、HDFS读流程

1.初始化FileSystem,然后客户端用函数open()打开文件 。

2.FileSystem调用元数据节点,得到数据块信息,并对每一个数据块、元数据节点返回,保存数据块的数据节点地址。

3.客户端调用stream的read()函数开始读取数据。

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

5.当第一个数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。

 6.当客户端读取完毕数据的时候,调用FSDataInputStream的close()函数,关闭连接。

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


四、HDFS写流程

1.初始化FileSystem,客户端调用create()来创建文件。

2.FileSystem调用元数据节点,在文件系统的命名空间中创建一个新的文件,元数据节点确定文件原来不存在后,给客户端创建文件的权限,然后创建新文件。

3.FileSystem返回DFSOutputStream,客户端用于写数据,客户端开始写入数据。

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

5.DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。

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

7.最后调用DFS方法,告诉NameNode流程完成。

注:如果数据节点在写入的过程中失败,关闭pipeline,将ack queue中的数据块放入data queue的开始,当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。

你可能感兴趣的:(HDFS读流程和写流程图解)