## HDFS读写流程
*上传*
- client客户端向NameNode申请上传文件(Hadoop2.7.2)
- NameNode响应是否可以上传(检测用户权限等),审核不通过,不允许上传,审核通过,会将文件逻辑拆分(默认是128M)
- 客户端启动一个输出流FSDataOutPutStream并向NameNode请求上传第一个Block
- NameNode返回 DataNode列表(设置了几个备份NataNode,返回几个)
- client客户端向DataNode1请求建立连接,NataNode1向下一个DataNodeN请求建立连接…,DataNodeN回复DataNode1应答成功,DataNode1向客户端回复应答成功
- 客户端向DataNode1发送传输Packet队列,DataNode1将队列中的Packet进行落地,并将Packet队列向DataNodeN传输,,当DataNodeN将包落地完成后会向上一个DataNode返回落地成功,上一个DataNode本身落地成功,并且收到DataNodeN落地成功的信息,继续向上一个执行此操作,当DataNode1落地成功后,并收到DataNode2的落地成功的信息后,会向client返回第一块block上传成功
- 第二块block重复第一块的操作,直至所有block上传成功
- client客户端发送上传成功给NameNode并关闭FsDataOutPutStream
- NameNode收到消息后会将其信息添加到元数据里去
NameNode会将离client最近的一个DataNode作为DataNode1
每一个Block上传选择的DataNodfe是随机的
下载
- client客户端向NameNode发送下载请求
- NameNode检查是否有权限,文件是否存在
- 若NameNode表示可以正常下载,则Client客户端会启动FileDataInputStream并请求下载第一个block,NameNode会返回存了相关信息的DataNode(包含副本)
- Client客户端会向DataNode1请求建立连接
- DataNode1若应答成功则会向Client传输Packet包
- 直至所有的Block传输完成,则NameNode向client客户端发送下载完成请求
- Client会关闭FileDataInputStream下载完成
packet包默认是64K,
client客户端只会向DataNode1交互,只有在DataNode1失联的情况下,才会向下一个DataNode交互