HDFS写入数据
宏观流程
1.客户端发送命了hdfs dfs-put user.log
2.HDFS接收请求,并验证命令的准确性,远程调用create()方法
3.检查(是否有权限,路径是否正确,是否存在)
4.检查结果 不通过,抛出对应异常
通过,返回成功,创建一个映射对象,该对象存放文件元数据,文件与块的映射关系
5.接收 不通过将异常返回给客户端
通过,创建一个客户端的输出流,返回给客户端,这个输出流叫FSDataOutputStream
6.文件上传 文件拆分成块进行上传,将块写入输出流
7.询问每个块存放到哪个DataNode节点
8.创建管道 根据NameNode返回的节点创建管道,数据以单个packet来传递
每个128大小的块传输完成后关闭管道,然后返回步骤7进行下一个块的传输
9.所有的块传输完成后,关闭输出流
微观流程
1.将硬盘中的内容使用Buffered读到自己的缓存中
2.Buffered中的字节组装到Packet
过程:
使用一个更小的单元chunk存放到packet中
为了提高传输效率,将装好的packet放到一个队列中进行传输
分为两个队列 DataQueue队列 数据队列
AckQueue队列 应答队列
由DataStreamer来取出packet发送 发送给输出流 将其挂载到应答队列
ResponseProcess进程接收管道应答:
收到接收成功信息后,将在应答队列删除已经传输成功的块
如果收到哪个块发错的信息,将存在应答队列中的该块以及后面的块重新移到数据队列,重新发送
读取数据流程
1.客户端读取数据发送命令 hdfs dfs -get
2.rpc远程调用open()方法
3.检查
4.检查通过微客户端创建一个输入流FSDataInputStream
5.客户端请求文件和BLK的关系,请求BLK与DD的关系
6.客户端获取文件第一个BLK的信息,返回所在的DN
7.客户端直接就近原则选择DN对应的数据
8.依次类推读取其他块信息,直到最后一个块,将BLK拼成一个文件
9.关闭FSDataInputStream