HDFS写流程(微观)
HDFS写流程(微观)
1.写数据就是从客户端上的数据上传到hdfs上
·
宏观过程
1.首先客户端对主节点(NN)发送文件,主节点(NN)进行接收文件,在接收过程中,例如客户端向主节点发送一个put命令上传文件,在接收数据的过程中,会首先调用RPC的通信过程调起NN的put方法,先将文件放在Hadoop集群的一个缓冲区里面进行存储,接着对文件进行切分(默认是128M产生一个block块,并且通过机架感知知道存储在哪一个DN上)。
2.在namenode接收到数据后,他会进行校验,校验文件的权限,路径是否存在等等,当校验通过后,在namenode元数据建立的映射关系下,返回一个状态给客户端,在客户端接收到了namenode所发送的信息。
a. nn首先检查是否有足够的空间权限等条件创建这个文件,或者这个路径是否已经存在,权限
b. 有:NN会针对这个文件创建一个空的Entry对象,并返回成功状态给DFS
c. 没有:直接抛出对应的异常,给予客户端错误提示信息
3.如果DFS接收到成功的状态,会创建一个FsDataOutputstream的对象给客户端使用。
4.然后客户端根据block块来进行传输,首先客户端会先进行询问namenode,block块的传输位置,然后namenode会通过机架感知和所存储元数据的副本数告诉客户端如何存储。
5.然后这边客户端会将一个block块继续划分成更小的package(默认一个packet大小为64K,Block128M为2048个packet),然后逐个进行发送,这边的Hadoop集群从节点从开启服务开始,向namenode进行汇报,保持心跳机制,然后datenode通过pipeline(管道)进行连接(在进行写数据的情况下使用FDSoutputstream对象DN会使用pipeline进行连接)。
将缓存中的数据以chunk(512B)和checksum(4B)的方式放入到packet(64k)
1. chunk:checksum=128:1
2. checksum:在数据处理和数据通信领域中,用于校验目的的一组数据项的和
3. Packet中的数据分为两类,一类是实际数据包,另一类是 header 包。
4. 一个 Packet 数据包的组成结构:分两类,一类是实际的数据包(包含了校验数据和客户信息;),另一类是header包。


6.然后这边客户端通过pipeline管道开始使用FDSoutputstream对象将数据输出
这边会将package包放在一个缓冲队列DateQueue(先进先出的队列),在上一次数据发送完成后,这个包发送到DataNode中,会先复制一份到AcKQueue中,然后将数据发送到DataNode中,再返回消息给客户端成功后,删除ackQueue的包,接着发送下一个dateQueue中的包,同样复制一份到ackQueue中,以此类推,直到数据全部发送完毕
1. 客户端首先将一个 packet 发送给 node1, 同时给予 node1 一个 ack 状态
2. node1接受数据后会将数据继续传递给 node2, 同时给予 node2 一个 ack 状态
3. node2接受数据后会将数据继续传递给 node3, 同时给予 node3 一个 ack 状态
4. node3将这个 packet 接受完成后,会响应这个 ack 给 node2 为 true
5. node2会响应给 node1 , 同理 node1 响应给客户端
7.在一次package发送完成后,会给客户端发送信息,如果客户端收到了成功的状态,会认为是这个包发送成功,会继续下一个包的发送,直到所有包都发送完成。
1. 如果客户端接收到最后一个 pakcet 的成功状态 , 说明当前 block 传输完成,管道就会被撤销
2. 客户端会将这个消息传递给 NN , NN 确认传输完成
1. NN会将 block 的信息记录到 Entry, 客户端会继续向 NN 询问第二个块的存储位置 , 依次类推
block1 (node1 node2 node3)
block2 (node1 node3 node6)
....
blockn(node1 node4 node6)
8.最终datenode保存的数据是


浙公网安备 33010602011771号