Hadoop之HDFS(二)


  上篇主要介绍了HDFS的一些基本知识,这篇主要讲解HDFS的读写流程以及一些其他的知识点。

1、HDFS读流程

 ; HDFS的读流程比较简单,主要如下图所示。
在这里插入图片描述
  1、首先客户端Client会创建FileSystem对象,而其具体的实现则是DistributedFileSystem,调用该对象的open方法,并通过RPC与NameNode进行通信;
  2、NameNode会给客户端返回一些block的信息,比如block块位置信息,该信息是被封装在了一个FSDataInputStream的输入流中;
  3、客户端通过FSDataInputStream流读取离客户端最近的datanode上的block;
  4、读取完当前的block的数据之后,关闭当前与datanode的连接,并寻找下一个block的datanode节点;
  5、读取完一个block,都会进行checksum计算,若读取datanode出现错误时,客户端会通知namenode,然后从该数据的另一个block继续读取。

2、HDFS写流程

  HDFS的写流程相对于读流程来说是比较复杂的,在介绍写流程之前,相对其中的一些概念进以说明。

  • chunk:chunk是进行写入的时候进行校验的最小单位,一个chunk是512Byte(数据)+4Byte(校验和checksum),当数据进行写入的时候,首先会被分成一个个512Byte大小的字节,并对这些字节做checksum(算法是CRC32)
  • packet:packet是数据进行写入的最小单位,HDFS进行写入的时候不是数据内容一次性的全部写入,而是以一个packet为基本单位,进行写入。packet的大小为64KB。

  下图所示即为HDFS的写流程示意图
在这里插入图片描述
  下面对HDFS的写入流程进行深入分析
  1、首先客户端Client会创建FileSystem对象,而其具体的实现则是DistributedFileSystem,调用该对象的create方法,客户端通过RPC与NameNode进行通信;
  2、NameNode会检查文件是否存在,检查权限等,若通过检查,则会返回FSDataOutputStream输出流对象;
  3、输出流对象建立好后,则调用write方法进行数据的写入。首先会将数据写入到chunk中,当chunk为512Byte时,对chunk进行checksum,并将整体放入到packet中,当packet达到64KB后,将packet放入到data queue中,而此时datanode则从packet中拿取数据进行写入
  4、写入的过程是将packet先写入到datanode1,再由datanode1写入到datanode2,在由datanode2写入到datanode3。
  5、之后进行ack的返回,返回的顺序与写入的顺序刚好相反,由datanode3到datanode2,再到datanode1。
  6、若ack queue收到确认写入的消息后,则将ack queue中的packet移除,若没有,则将ack queue中的packet重新放回到data queue中。

3、HDFS联邦

  NameNode存储的是datanode的元数据信息,而这些元数据信息是保存在NameNode节点的内存之中的,这就导致对一个超大集群来说,内存会成为限制系统横向扩展的瓶颈。在系统的整体性能方面,其吞吐量会受到单个NameNode的影响。所以,在2.X之后引入联邦机制来解决上述问题。
  在联邦的情况下,每个NameNode维护一个命名空间卷,由命名空间的元数据和一个数据块池组成,数据块池包含该命名空间下文件的所有数据块。命名空间卷之间是相互独立的,两两之间也不通信,NameNode之间也互不影响。因此,集群中的DataNode需要到每个NameNode中进行注册,并且存储着来自多个块池的数据块。
  联邦的出现主要解决了以下问题
  1、系统的扩展性可以进行横向提升
  2、系统的性能随着联邦的出现,吞吐量不在受限于单个NameNode节点
  3、隔离性,一个程序的运行不会由于资源消耗过多的问题影响另一个程序的运行

4、HDFS的高可用

  对于HDFS来说,NameNode中保存的是元数据信息,并管理文件系统的命名空间和处理客户端的读写请求。在一个集群中,如果只存在一个NameNode,一旦发生故障,则会使整个系统失效。
  我们知道,在HDFS的架构中,有个SecondaryNameNode,但这个不是NameNode的热备份,在NameNode发生故障时,NameNode无法立即切换到SecondaryNameNode并对外提供服务。所以,针对这种情况,HDFS2.X增加了对HDFS高可用(HA)的支持,配置了一对(active-standby)NameNode。
  当active NameNode失效后,standby NameNode会接管任务并服务于来自客户端的请求,不会有任何明显的中断。由于standby NameNode是active NameNode的热备份,所以active NameNode的信息必须实时的同步到standby NameNode上,该同步的实现方式是通过共享存储系统来实现状态同步的,共享存储系统可以使用NFS过滤器或群体日志管理器QJM来实现。
  QJM是专用的HDFS实现,其是以一组日志节点的形式运行,每一次编辑必须写入到多数的日志节点,被推荐用于大多数的HDFS部署中。QJM的实现并没有使用到Zookeeper技术,但NameNode的选举使用到了Zookeeper技术。active NameNode将更新的数据写入到共享存储 系统,standby NameNode一直监听该系统,一旦发现有新的数据写入,立即将这些新的数据读取并加载到自己的内存中,从而保证与active NameNode的状态一致。由于这种设计,则需要DataNode将心跳信息和块报告信息同时发送到这两个NameNode上。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值