HDFS的读写流程
HDFS写流程(上传流程)
需要的东西:要上传的文件、客户端Client、NameNode首先,需要在客户端Client上创建一个分布式文件系统的对象(DistributedFileSystem),然后客户端申请向NameNode上传文件,NameNode会向客户端响应是否可以上传文件。(判断的标准:要申请的上传文件的目录不存在,且具有写权限)紧接着,客户端会开一个HDFS的输出流叫做FSDataOutputStream,请求NameNode上传第一个文件块,然后NameNode会返回一个DataNode的列表(副本数)给客户端,告诉客户端可以上传的文件块的位置在哪里。这时候,客户端采用就近原则,先与DN1建立TCP的通信通道(串行通道),紧接着和DN2、DN3建立通信通道,建立通道以后,会相应的给出应答。然后客户端就会以Packet(64KB)数据包的形式发送数据给DN1,DN1一边往磁盘缓存数据,一边同步数据到DN2、DN3中。之后,会上传第二个文件块,与上述描述情况类似。最后,当两个文件块的数据都上传完以后,客户端会告诉NameNode文件上传完毕,NameNode就更在元数据中更新一下元数据,整个HDFS写流程就完毕了。
HDFS读流程(下载流程)
需要的东西:客户端Client、NameNode首先,需要在客户端创建一个分布式文件系统的对象(DistributedFileSystem),然后客户端会申请向NameNode下载文件,NameNode会给客户端响应要下载的文件存在还是不存在。(判断的标准:申请的文件是存在的、且具有读权限)紧接着,客户端会开一个HDFS的输入流叫做FSDataInputStream,请求NameNode来下载第一个文件块,然后NameNode会向客户端返回一个DataNode的列表给客户端,表示可以在哪些DataNode中读取文件块。这时候,客户端会采用就近的原则,向第一个DN1建立通信通道,DN1应答成功,以Packet数据包的形式传输数据到客户端,并且会往本地磁盘写数据。之后,会下载第二个文件块,与上述的描述情况类似。最后,NameDode会向客户端通知数据传输完毕。