Hdfs读写流程叙述-随便记记

hdfs写流程

客户端初始化filesystem对象 调用create方法 创建新文件 向namenode申请写文件

namenode会检查权限和路径 没问题之后返回输入流对象dfsoutputStream

客户端对文件进行切块 128m一块

客户端向namenode申请写第一块  namenode根据副本个数和datanode节点的健康程度返回一个datanode队列 默认3个

客户端直接连接第一个datanode 之后第一个连接第二个  第二个连接第三个  建立管道pipeline 

客户端开始写入数据

写入数据的时候  dfsoutputstream对文件进行切分 切分成packet 64kb  packet又可以细分为chunk 512b的数据和4b的元数据

当写满一个packet之后 会放到data quene中 就是一个队列 先进先出  

之后datastreamer线程会不断的从data队列中 取出packet 通过pipeline发送到第一个datanode上 第一个datanode复制packet落盘 当成功落盘之后 该packet会被放到ack队列中

第一个datanode负责将packet写入到第二个datanode 同时dataStreamer可以向第一个datanode发送第二个packet  第二个datanode负责将packet写入到第三个

当第一个packet在第三个datanode成功落盘后  会返回确认信息 ack(确认)队列中的packet才会被删除

当这一块文件全部传输完毕之后 会断开pipeline管道 向namenode申请上传第二块 重复之后的步骤

 

如果在写的过程中  某个datanode坏掉了 会断掉pipeline 然后将ack队列中的packet拿出来放回data队列中 

删除坏掉的DataNode上的数据  接着向剩下两个datanode写  写完之后namenode会找一个新的datanode进行块复制

 

hdfs读流程

客户端调用filesystem的open方法 从namenode获取块的位置 包括副本的位置

之后会调用read方法 读取最近的一个datanode 到达数据末端 断开连接 接着寻找下一块

如果在读的过程中连接发生异常 则会连接下一个datanode进行读取 同时以后读取其他块的时候会直接跳过这个节点

客户端也会对数据块进行检查 如果发生异常 会告知namenode 客户端会读取该块的其他镜像

因为namenode只负责管理块的位置信息  所以支持大量客户端的并发读

posted @ 2021-02-25 16:18  唐松林  阅读(52)  评论(0)    收藏  举报