读数据原理
1. 先去请求namenode读数据
2. 查询元数据信息并返回查询的文件的块个数,块的存储位置
3. 根据第二步返回的信息进行块的信息读取,先就近读取再随机读取,根据块的id从小到大依次读取,读取的时候会启动一个输入流FSDATAINPUTSTREAM
4. 会把先读取到的块的信息写入到缓存中,后续读取的块信息依次追加
写数据原理
写入数据的时候会产生一个校验和文件(checksum 512字节) 读数据的时候会进行checksum验证,验证通过证明读取的块信息是没有损坏的
1. 向namenode发送写数据的请求
2. namenode会查询自己的元数据信息,返回一个可以上传的相应
3. 客户端向namenode请求分配datanode
4. namenode向客户端返回空闲的datanode节点(按空间和距离进行计算(同节点、同机架、其他))和一个输出流进行文件写入
5. 客户端先找到最近的节点建立通道,再有最近的节点依次向剩余的节点之间相互建立通道
6. datanode依次返回响应,返回通道建立完成
7. 客户端进行数据写入,以packet为单位进行写入,先写入到缓冲区中,从缓冲区中依次向另外的datanode节点进行发送,也是先发送到缓冲区中,最终需要落地到磁盘中
8. 文件块写完毕会依次向前返回响应,客户端接收到返回响应的时候就认为这个块写完了,进行下一个块的写入循环上面的步骤。