大数据离线-HDFS-(中)读写原理解析

本次介绍HDFS,分为上,中,下,三篇

  • 上篇入HDFS门介绍,常用操作
  • 中篇为HDFS的读写原理介绍
  • 下篇为HDFS的测试Demo,常用API

1. NameNode概述

  • HDFS 的核心,也称为 Master。

  • 存储内容:存储 HDFS 的元数据: 存储并跟踪目录树结构文件,Block信息及位置

  • 存储方式:不持久化存储DataNode的信息,这些信息会在系统启动时从数据节点重建。

  • 性能要求: NameNode 所在机器通常会配置有大量内存(RAM)。 NameNode 是 Hadoop 集群中的单点故障。


2. DataNode概述

  • 负责将实际数据存储在 HDFS 中。称为 Slave。

  • 定期心跳:和NameNode 保持不断通信。启动时,它将自己发布到 NameNode 并汇报自己负责持有的块列表。定期(dfs.heartbeat.interval 配置项配置,默认是 3 秒)向NameNode 发送心跳

  • 失效判定:如果 NameNode 长时间没有接受到 DataNode 发送的心跳, NameNode 就会认为该 DataNode 失效。

  • 单节点故障处理方式:当某个 DataNode 关闭时,它不会影响数据或群集的可用性。 NameNode 将安排由其他 DataNode 管理的块进行副本复制。

  • 性能要求:所在机器通常配置有大量的硬盘空间。因为实际数据存储在DataNode 中。

  • block 汇报时间间隔取参数 dfs.blockreport.intervalMsec,参数未配置的
    话默认为 6 小时.


3. HDFS存储数据原理

首先介绍HDFS的工作机制

  • NameNode 负责管理整个文件系统元数据;
  • DataNode 负责管理具体文件数据块存储;
  • Secondary NameNode 协助 NameNode 进行元数据的备份。

HDFS 的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向NameNode 申请来进行。

  • 写入数据原理图
    大数据离线-HDFS-(中)读写原理解析

  • 写入数据步骤

    1. client 发起文件上传请求,通过 RPC 与 NameNode 建立通讯

    2. NameNode检查目标文件是否已存在,父目录是否存在

    3. 返回是否可以上传的响应

    4. Cilent请求第一个Block应该上传到哪个DataNode

    5. NameNode 根据配置文件中指定的备份数量及机架感知原理进行文件分配,注意:在hadoop设计时候考虑到安全于高效,数据文件默认在HDFS上存储3份,存储策略为本地一份,同机内其它某一节点上一份,不同机架的某一节点上一份

    6. 返回可用的DateNode地址:DatenNode1,DataNode2,DtaNode3

    7. client 请求 3 台 DataNode中的一台 DateNode1上传数据(本质上是一个 RPC 调用,建立 pipeline),DateNode1收到请求会继续调用DateNode2,然后DateNode2调用DateNode2;

    8. 将整个pipeline 建立完成, 后逐级返回 client.

    9. Client开始向DataNode1写入数据Block-1(先从本地磁盘放入本地内存缓存),以packet为单位(默认64K),

    10. DateNode1将数据保存,再将数据传输给DataNode2保存,再传输DataNode3

    11. 在pipiline的反方向上会进行数据保存结果的校验,逐个发送ack(命令正确应答)

    12. 最终由DateNode1将ack发送给客户端,数据保存完成。

核心点是文件的分配


4.HDFS读取数据原理

  • 读取数据原理图
    大数据离线-HDFS-(中)读写原理解析

  • 读取数据步骤

    1. Client 向 NameNode 发起 RPC 请求, 来确定请求文件 block 所在的位置;
    2. 返回数据排序

      • 返回数据: NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode都会返回含有该block副本的DataNode地址;
      • 排序: 这些返回的DN地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,
        排序两个规则
      • 网络拓扑结构中距离 Client 近的排靠前;
      • 心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后;
    3. 底层本质上建立的是Scoket Stream,重复的调用父类的DateInputStream的read方法,知道这个块上的数据读取完毕,再获取下一个Block,进行进行重复工作。
      读取完成每一个Block,都会进行checksum验证。如果读取DateNode时候出现错误,Client会从下一个拥有这个副本的节点中进行读取。

    4. 读取完成后最终对Block进行合并,产生完整的a.txt

HDFS的读取和写入流程简介完成,更多的详情,需要去再源代码中进行读取。
本博客会持续推出大数据学习的完整教程,有兴趣的同学可以关注,也可以留言评论,联系博主获取更多资料,免费噢!