写文件:
- client向远程NameNode发起RPC请求;
- NameNode检查文件是否存在,成功则为文件创建一个记录;
- client根据block size将文件切分成多个packets,并以“data queue”的形式进行管理,另外获取block的replication数;
- 以pipeline的形式将packets写入所有的replication中,先写入第一个DataNode,该DataNode把packets存储之后,将其传递给pipeline的下一个DataNode,直到最后一个DataNode(流水线形式);
- 最后一个DataNode存储成功后返回ack确认,在pipeline中传递到client;
- 传输过程中某个DataNode故障,则将当前pipeline关闭,移除故障的DataNode,剩余的DataNode仍以pipeline的形式传输,根据replication数量,分配需要的DataNode;
- client完成数据的写入之后,调用close()方法,关闭数据流
读文件:
- client向远程namenode发起RPC请求;
- namenode返回文件的block列表,元数据,DataNode地址等信息;
- client选取离它最近的datanode读取block;
- 读取完当前block之后,关闭DataNode连接,开始读取下一个最佳位置的block;
- 直到所有数据读取完之后,关闭数据流。