一、HDFS读流程
1、client跟namenode通信查询元数据,找到文件块block所在的datanode服务器
2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流
3、datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验,大小为64k)
4、客户端以packet为单位接收,现在本地缓存,然后写入目标文件
二、HDFS写流程
1、client向namenode发送写入请求,namenodea判断文件是否存在、是否拥有权限、父目录是否存在等;
2、namenode返回是否可以写入;
3、向namenode请求第一个block应该传输到哪些datanode服务器上;
4、namenode返回三个datanode服务器,这里的3是指默认需要将block备份三次;
5、client请求3台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将整个pipeline建立完成,逐级返回客户端;
6、client向A传输第一个block,以packet(64kbyte)为单位,A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答;
7、当一个block传输完成之后,client再次请求namenode上传第二个block的服务器。

总结:
1、namenode是数据读写的唯一入口和出口;
2、读:clinet ------>(询问block所在位置) namenode -----> 与该datanode建立请求 -----> datanode发送数据
3、写:clinet ------>(询问文件是否能写入) namenode -----> 询问第一个block应该存储在那些datanode ------> 挑选datanode中的一台,建立请求
本质上是一个RPC调用,建立pipleline A----> B -----> C -------> 向A传输第一个block, A ---> B -----> C -----> 都传完才算一个block传输完毕。
接着传输下一个block。