大数据离线-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 申请来进行。

4.HDFS读取数据原理

  • 读取数据原理图
    在这里插入图片描述

  • 读取数据步骤

  1. 客户端通过调用fileSystem对象的open方法,打开希望读取的文件。实际对应HDFS来说是一个分布式文件系统的实例。
  2. DistributedFileSystem通过使用RPC来调用NameNode,确定文件的起始位置,返回每一个副本的dataNode地址信息。这些dataNode会根据于客户端的距离来排序。DistributedFileSystem返回一个FSDataInputStream类给客户端并读取数据,FSDataInputStream类封装了一个FSDataInputStream对象,该对象管理dataNode和nameNode的IO。
  3. **客户端对FSDataInputStream对象输入流调用read方法,**FSDataInputStream就会连接距离最近的datanode,反复调用read方法将数据传送到客户端,到达末端是FSDataInputStream会关闭于该dataNode的连接,寻找下一个dataNode。当dataNode的location信息读完,会询问nameNode来检索下一批Block的位置信息。
  4. FSDataInputStream持续读取Block文件数据。
  5. FSDataInputStream持续读取Block文件数据。
  6. 客户端读取完成,就对FSDataInputStream调用close的方法。
  • 读取文件中断或者错误的情况
    • 在FSDataInputStream读取的过程中,如果于DataNode出现通信错误,便会尝试从临近的另外一个dataNode中读取。同时记录该dataNode的信息,以后不会反复读取该节点的块数据。
    • FSDataInputStream也会校验读取数据的完整性,如果损坏就会在读取下一个副本之前通知nameNode。

网络拓扑图与Hadoop

在海量数据处理中,主要的限制因素是节点之间的数据传输速率,这里的想法是将两个节点之间的带宽作为距离的衡量标准。带宽递减的等级如下:

  • 同一节点中的进程
  • 同一机架上的不同节点
  • 同一数据中心的不同机架
  • 不同数据中心的节点
    用图片展示如下:
    在这里插入图片描述

HDFS的文件读取流程

在这里插入图片描述

写入文件流程
  1. DistributedFileSystem对象调用create方法创建文件

  2. DistributedFileSystem对nameNode创建一个RPC调用,nameNode创建一个新的文件,nameNode执行各种检测文件是否存在,判断用户权限。为新的文件创建一条记录;否则判处IO异常。返回DFSOutputStream,负责处理dataNode与NameNode之间的通信。

  3. 客户端写入数据时,DFSOutputStream将文件文臣一个个数据包,并写入内部队列,称为数据队列。
    在这里插入图片描述

  4. 这一组datanode构成一个管线,DataStreamer将数据包流式的传送到管线中的一个datanode,该数据包存储数据并且流式的往下发送,直到设置备份数的最后一个节点。

  5. DFSOutputStream也维护者一个内部数据包队列来等待datanode收到消息确认回执,也成为确认队列(ack queue),确认后数据才会被从队列中删除。

  6. 客户端完成写入后,会对数据流调用close()方法。该操作将剩余的所有数据包写入datanode的管线中,并在联系nameNode发送文件完成之前等待确认,nameNode已经知道了文件由那些块组成(通过DataStream),所以在返回成功之前只需要等到数块进行最小量的复制。

数据写入期间,dataNode节点发生故障。

如果在数据写入期间,dataNode节点发生故障,会执行一下操作(对客户端透明)

  1. dataNode2节点故障
  2. 关闭管线(Pipeline of dataNodes)确认把队列中的任何数据包都添加到数据队列的最前端,以确保故障节点下游不会漏掉任何数据包。
  3. 为存储在另一正常dataNode的当前数据块指定一个新的标识。并将标识发送给nameNode以便故障dataNode在恢复后可以删除存储的部分数据块。
  4. 为存储完全的数据在下次启动的时候会自动被删除。
  5. 从管线中删除故障数据节点
  6. 并且把余下的数据块写入管线中的两个正常的datanode.
  7. nameNode注意到副本数量不足时候,会在另一个节点上新建副本,后续的数据块继续正常接收处理。
    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值