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只负责管理块的位置信息 所以支持大量客户端的并发读

浙公网安备 33010602011771号