Hadoop分布式文件系统(HDFS)架构概述及基本概念

Hadoop是一个分布式的存储计算框架,其中底层的HDFS是构建面向应用的高层次模块的基础(当然也可以使用其API直接访问HDFS), 比如HBase可以是基于HDFS来存储其HFile文件, 计算框架MapReduce可以使用HDFS中存储的数据. 本文档说明HDFS的基本概念以及架构,以便能从Hadoop纷繁复杂的架构中,对其HDFS存储模块有个宏观的了解.

本文档将略去HDFS中那些保证其高可用性的组件, 比如Hadoop某些版本中实现的Secondary NameNode(或者Backup NameNode), 甚至Zookeeper分布式协调服务组件等, 但是不影响了解HDFS的基本架构.从宏观上将, HDFS包括三个角色, client, NameNodeDataNode.在Hadoop分布式系统中, 这三个角色的节点一般是不同的物理机器. 也可以部署伪分布式系统, 将这三个角色节点部署在同一物理机上.

这三个角色的功能分别为:

  • DataNode是存储节点, HDFS中的文件的内容存储在DataNode节点上.HDFS之所以是个分布式系统, 是因为DataNode节点是个集群.DataNode终究要使用本地文件系统进行存储.DataNode一方面连接了本地文件系统, 另一方面对HDFS提供了block的逻辑. 存储在HDFS中的文件是被分割成block的,一个文件的block是存储在多个DataNode中.同时根据配置,某一个指定的block,可以在多个DataNode节点中存在副本.DataNode将一个block存储成本地文件系统中的一个文件.
  • NameNode是个单节点, 主要有两个作用: 一方面管理HDFS文件系统命名空间,即文件名及其包含哪些block;另一方面管理每个block所在的DataNode节点.可以把这些看成是HDFS的中的元数据,NameNode将这些元数据存储在本机文件系统上.NameNode节点启动时,会尝试装载该元数据文件(如果存在)内容到内存中,以加速访问.
  • DFS client节点通过Hadoop jar包提供的API来访问HDFS.这是提供给程序开发人员的接口节点.

程序设计人员使用client API访问HDFS文件, 比如创建文件, 读写文件, 重命名文件等等,因此,这些API和传统的文件系统存在相似的功能意义.在执行这些client API的过程中,涉及到不同节点间的交换逻辑.client和NameNode间的交互定义为client protocol, DataNode和NameNode间的交互定义为Datanode protocol, 如下图所示:
在这里插入图片描述
这三个角色涉及到交互逻辑有:

  • client API访问HDFS文件的元数据时, 需要和NameNode节点进行通信.比如调用client API新创建一个文件时, 需要NameNode返回一个可用的DataNode节点地址.比如重命名一个文件时, NameNode更新其文件命令空间中的元数据.又比如调用client API浏览HDFS文件系统结构时, NameNode返回其管理的文件系统树结构.
  • client API写文件时, 通过socket插口将数据写入到DataNode中(NameNode已经向client返回了可用的DataNode地址), 写入操作是以block为单位的, 即,将一个block数据块写入一个DataNode节点后,client断开与该DataNode的socket连接,并向NameNode报告block写入完成, 后续block将写入其他DataNode中.整个文件写入完成时, 还需要通知NameNode来更新其管理的元数据. client API读文件时, NameNode将返回该文件所有块的相关信息, 包括大小(只有最后一个block的大小可能与其他block不同)以及所在的DataNode节点地址.需要注意的是,对于同一个block, 可能存在多个DataNode副本地址. client API通过socket插口从这些DataNoe中依次读出所有block数据, 也就是读取了整个文件的数据.对于某个指定的block,存在多个DataNode副本地址, 有client决定从哪个DataNode副本上读取这个block的数据.比如, client和某个DataNode是部署在同一个物理机器上, 而且要读取的文件的某个block也存在于这个机器上, 此时就可以从本机的DataNode上读取这个block的数据, 而不用通过网络从其他DataNode副本上读取这个block的数据.
  • DataNode向client提供block的读写操作. 当接受client的block写入操作时,socket传输的除了这个block的数据内容,还包括其他元数据.因为可能根据配置, 一个block数据需要写入到多个DataNode副本中, 元数据中即包括了副本DataNode的地址.因此, 该DataNode还将负责把这个block数据写入到其他副本DataNode中.当一个block写入完成时, DataNode会向client返回一个确认消息.
  • DataNode维持和NameNode的心跳消息.通过心跳消息,NameNode知道哪些DataNode是正常状态的, 同时会把其磁盘容量和剩余空间等信息报告给NameNode, 以便其进行block分配时作为参考.DataNode也会定时将其节点上存储的block信息上报给NameNode,该消息的响应中,NameNode指示其中哪些block是过时, DataNode可以删除本地过时的block数据.NameNode也可能发送给DataNode一些指令, 比如由于指定block的某个副本DataNode下线, 导致该block的可用性降低, 当前DataNode收到指令后,会将这个block写入到一个可用的DataNode上.

有几个细节需要注意的是:

  • client 向DataNode写入数据时, 可能先把数据写入其本地文件系统中, 当写入数据达到一个block大小时, 再将这个block写入到DataNode连接的socket上去.
  • 当DataNode接受到一个block数据, 并需要想其他副本DataNode写入这个block时, 可以采用pipeline的方式, 也可以采用类似fanout的方式. pipeline的方式可能会有较大的延迟, 但是占用较小的网络流量.fanout的特性正好相反.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值