• HDFS文件读取流程


    写操作

    1)client 客户端发送上传请求,通过 RPC 与 namenode 建立通信,namenode 检 查该用户是否有上传权限,以及上传的文件是否在 hdfs 对应的目录下重名,如 果这两者有任意一个不满足,则直接报错,如果两者都满足,则返回给客户端一 个可以上传的信息
    2)client 根据文件的大小进行切分,默认 128M 一块,切分完成之后给 namenode 发送请求第一个 block 块上传到哪些服务器上
    3)namenode 收到请求之后,根据网络拓扑和机架感知以及副本机制进行文件 分配,返回可用的 DataNode 的地址

    机架感知策略:Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为:
    第一个block副本放在客户端所在的数据节点里(如果客户端不在集群范围内,则从整个集群中随机选择一个合适的数据节点来存放)。
    第二个副本放置在与第一个副本所在节点相同机架内的其它数据节点上
    第三个副本放置在不同机架的节点上

    4)客户端收到地址之后与服务器地址列表中的一个节点如 A 进行通信,本质上 就是 RPC 调用,建立 pipeline,A 收到请求后会继续调用 B,B 在调用 C,将整个 pipeline 建立完成,逐级返回 client
    5)client 开始向 A 上发送第一个 block(先从磁盘读取数据然后放到本地内存缓 存),以 packet(数据包,64kb)为单位,A 收到一个 packet 就会发送给 B,然 后 B 发送给 C,A 每传完一个 packet 就会放入一个应答队列等待应答
    6)数据被分割成一个个的 packet 数据包在 pipeline 上依次传输,在 pipeline 反 向传输中,逐个发送 ack(命令正确应答),最终由 pipeline 中第一个 DataNode 节点 A 将 pipelineack 发送给 Client
    7)当一个 block 传输完成之后, Client 再次请求 NameNode 上传第二个 block ,namenode 重新选择三台 DataNode 给 client

    读操作

    1)client 向 namenode 发送 RPC 请求。请求文件 block 的位置
    2)namenode 收到请求之后会检查用户权限以及是否有这个文件,如果都符合, 则会视情况返回部分或全部的 block 列表,对于每个 block,NameNode 都会返 回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓 扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓 扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE, 这样的排靠后
    3)Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是 DataNode,那么将从本地直接获取数据(短路读取特性)
    4)底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕
    5)当读完列表的 block 后,若文件读取还没有结束,客户端会继续向 NameNode 获取下一批的 block 列表
    6)读取完一个 block 都会进行 checksum 验证,如果读取 DataNode时出现错 误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的 DataNode 继续读
    7)read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回 Client 请求包含块的 DataNode 地址,并不是返回请求块的数据
    8) 最终读取来所有的 block 会合并成一个完整的最终文件

    HDFS 在读取文件的时候,如果其中一个块突然损坏了,怎么办?

    客户端读取完 DataNode 上的块之后会进行 checksum 验证,也就是把客户端读取到本地的块与 HDFS 上的原始块进行校验,如果发现校验结果不一致,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的 DataNode 继续读

    HDFS 在上传文件的时候,如果其中一个DataNode突然挂掉了怎么办?

    客户端上传文件时与DataNode建立pipeline管道,管道正向是客户端向DataNode 发送的数据包,管道反向是 DataNode 向客户端发送 ack 确认,也就是正确接收到数据包之后发送一个已确认接收到的应答,当 DataNode 突然挂掉了,客户端 接收不到这个 DataNode 发送的 ack 确认 ,客户端会通知 NameNode,NameNode 检查该块的副本与规定的不符, NameNode 会通知 DataNode 去复制副本,并将挂掉的 DataNode 作下线处理,不 再让它参与文件上传与下载。

  • 相关阅读:
    ubuntu20安装docker、redis、mysql及部署net6应用
    创建一个Django项目
    2022年毕业生求职找工作青睐哪个行业?
    北大肖臻老师《区块链技术与应用》系列课程学习笔记[6]比特币脚本
    自适应MSER波束形成辅助接收机的MATLAB仿真
    成人高等教育本科生学士学位日语水平考试大纲
    浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写
    mongocxx连接池连接超时时间设置
    微服务-多级缓存
    查网站域名历史,查域名有没有灰记录,查域名有多少外链的好工具
  • 原文地址:https://blog.csdn.net/u011095039/article/details/126261103