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中的另外两个数据节点。元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。