一、写过程
①准备客户端(构建客户端对象)和服务端(启动NN和DN)
②客户端向服务端发送上传请求
③服务器端接收客户端的请求,并检查请求的合法性(路径是否存在,权限是否够等)
④如果合法,响应客户端可以上传,否则无法上传
⑤在上传时,数据以block的形式传输,写入到DN所在的机器。客户端请求上传第一块block,NN接收请求通过机架感知和设定的文件副本数返回客户端应该请求的DN列表
⑥客户端向DN列表中距离自己最近的节点发送建立通道的请求,建立成功后,这个节点会向离它最近的节点发送建立通道请求,以此内推直到所有节点通道建立完成
⑦通道建立完成后:
1)客户端传输当前文件的前128M(这个大小取决于你HDFS上设置的块大小)的数据
2)客户端读取数据,将数据封装为一个chunk(512b + 4b),多个chunk封装为一个packet(64kb传输的基本单位),将封装好的packet方法DataQuene(数据待传输队列)
3)在发送packet时,将DataQuene中的packet取出,发送给通道中的第一个DN节点,然后这个节点依次向后面的节点传输并建立副本,第一个节点每传入一个packe就会将这个packett放入akcQuene(待完成输出队列)
4)通道中的DN收到packet后,写入DN所在当前机器的磁盘(落盘),然后将packet发送到下一个节点,落盘,依次传输,每个DN在收到packet后都会向服务器发送ack消息,当服务器收到所有节点的ack消息后就会将packet从ackQuene中移出
⑧第一块数据上传完成后DN会上报NN已经存储了某个块
⑨重复⑤到⑧步直到所有数据上传完成
二、节点超时异常:
①在发送一个packet时,如果因为网络传输的原因或者DN故障等原因,导致NN一直没有收到某个DN节点的ack消息,直到超时,就会立刻终止传输
②在akcQuene中的pakcet就会立刻回滚到dataQuene中
③客户端会重新建立通道,但是会踢出那个超时的节点,通道完成后继续传输
④只要有一个节点落盘成功后,客户端就确认块写入成功,继续下一块传输
⑤副本数不够由后期NN来进行维护
三、读过程
①准备客户端和服务端(DN和NN)
②客户端向服务端发送下载请求
③服务器接收请求后检查该请求是否合法
④如果合法,服务端就会将客户端所请求的文件的元数据返回给客户端,否则客户端无法下载
⑤客户端开始下载第一个块,请求元数据列表中第一块可用的DN列表中的第一个DN节点下载第一个块
⑥依次重复第⑤步直到下载完毕
⑦下载完毕后,服务器端关闭流