HDFS基本原理


HDFS基本原理

一、什么是HDFS

HDFS即Hadoop分布式文件系统(Hadoop Distributed Filesystem),以流式数据访问模式来存储超大文件,它和现有的分布式文件系统有很多共同点。
但同时,它和其他的分布式文件系统的区别也是很明显的。
HDFS是一个高度容错性的系统,适合部署在廉价的机器上。
HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。
HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。
HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。

二、HDFS架构

HDFS集群包含一个单独的NameNode和多个DataNode。HDFS采用一种称为rack-aware的策略。Rack1 和Rack2。
这两类节点分别承担Master和Worker具体任务的执行节点。
总的设计思想:分而治之——将大文件、大批量文件,分布式存放在大量独立的服务器上,以便于采取分而治之的方式对海量数据进行运算分析。

备份数据的存放:备份数据的存放是HDFS可靠性和性能的关键。
HDFS采用一种称为rack-aware的策略来决定备份数据的存放。
通过一个称为Rack Awareness的过程,NameNode决定每个DataNode所属rack id。
缺省情况下,一个block块会有三个备份

  • 1、一个在NameNode指定的DataNode上
  • 2、一个在指定DataNode非同一rack的DataNode上
  • 3、一个在指定DataNode同一rack的DataNode上。
    这种策略综合考虑了同一rack失效、以及不同rack之间数据复制性能问题。

1、架构

【参考文档-Hadoop分布式文件系统:架构和设计】
Namenode 和 Datanode
HDFS采用master/slave架构。
一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。
Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。
集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。
HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。
从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。
Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。
它也负责确定数据块到具体Datanode节点的映射。
Datanode负责处理文件系统客户端的读写请求。
在Namenode的统一调度下进行数据块的创建、删除和复制。

1、文件系统的名字空间 (namespace)

HDFS支持传统的层次型文件组织结构。
用户或者应用程序可以创建目录,然后将文件保存在这些目录里。
文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
当前,HDFS不支持用户磁盘配额和访问权限控制,也不支持硬链接和软链接。
但是HDFS架构并不妨碍实现这些特性。

Namenode负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被Namenode记录下来。
应用程序可以设置HDFS保存的文件的副本数目。
文件副本的数目称为文件的副本系数,这个信息也是由Namenode保存的。

2、数据复制

HDFS被设计成能够在一个大集群中跨机器可靠地存储超大文件。
它将每个文件存储成一系列的数据块,除了最后一个,所有的数据块都是同样大小的。
为了容错,文件的所有数据块都会有副本。每个文件的数据块大小和副本系数都是可配置的。
应用程序可以指定某个文件的副本数目。
副本系数可以在文件创建的时候指定,也可以在之后改变。
HDFS中的文件都是一次性写入的,并且严格要求在任何时候只能有一个写入者。

Namenode全权管理数据块的复制,它周期性地从集群中的每个Datanode接收心跳信号和**块状态报告(Blockreport)**。
接收到心跳信号意味着该Datanode节点工作正常。
块状态报告包含了一个该Datanode上所有数据块的列表。

副本存放: 最最开始的一步

副本的存放是HDFS可靠性和性能的关键。
优化的副本存放策略是HDFS区分于其他大部分分布式文件系统的重要特性。
这种特性需要做大量的调优,并需要经验的积累。
HDFS采用一种称为机架感知(rack-aware)的策略来改进数据的可靠性、可用性和网络带宽的利用率。
目前实现的副本存放策略只是在这个方向上的第一步。
实现这个策略的短期目标是验证它在生产环境下的有效性,观察它的行为,为实现更先进的策略打下测试和研究的基础。

大型HDFS实例一般运行在跨越多个机架的计算机组成的集群上,不同机架上的两台机器之间的通讯需要经过交换机。
在大多数情况下,同一个机架内的两台机器间的带宽会比不同机架的两台机器间的带宽大。

通过一个机架感知的过程,Namenode可以确定每个Datanode所属的机架id。
一个简单但没有优化的策略就是将副本存放在不同的机架上。
这样可以有效防止当整个机架失效时数据的丢失,并且允许读数据的时候充分利用多个机架的带宽。
这种策略设置可以将副本均匀分布在集群中,有利于当组件失效情况下的负载均衡。
但是,因为这种策略的一个写操作需要传输数据块到多个机架,这增加了写的代价。

在大多数情况下,副本系数是3,HDFS的存放策略是将一个副本存放在本地机架的节点上,一个副本放在同一机架的另一个节点上,最后一个副本放在不同机架的节点上。
这种策略减少了机架间的数据传输,这就提高了写操作的效率。
机架的错误远远比节点的错误少,所以这个策略不会影响到数据的可靠性和可用性。
于此同时,因为数据块只放在两个(不是三个)不同的机架上,所以此策略减少了读取数据时需要的网络传输总带宽。
在这种策略下,副本并不是均匀分布在不同的机架上。
三分之一的副本在一个节点上,三分之二的副本在一个机架上,其他副本均匀分布在剩下的机架中,这一策略在不损害数据可靠性和读取性能的情况下改进了写的性能。

当前,这里介绍的默认副本存放策略正在开发的过程中。

三、HDFS核心组件详解

NameNode,又叫”元数据节点”

  • 1、NameNode是HDFS的核心模块,也是HDFS架构的master。NomeNode一点宕机则整个HDFS服务不可用。
  • 2、NameNode仅仅存储HDFS的元数据:文件系统中的文件目录结构,并且能跟踪整个集群中的文件。
  • 3、NameNode不存储实际的文件数据,实际数据是存储在DataNode中,他存储的是文件分块的基础数据;能通过文件获取文件的快列表及其分布在哪些dataNode上。
  • 4、NameNode并不会将文件的分块数据持久化存储,这些信息会在HDFS启动时由各个dataNode上报过来。他把这些数据存入内存中。并且会定时对内存中的数据进行快照。所以对于NameNode节点的机器内存应该大一些。
  • 5、NameNode在hadoop 2.0版本之前是单点的,Hadoop 2.0版本才提出了高可用 (High Availability, HA) 解决方案,并且经过多个版本的迭代更新,已经广泛应用于生产环境。Hadoop 3.0版本多个namenode(即支持一个集群中,一个active、多个standby namenode部署方式。)
  • 6、NameNode也可以将数据持久化。

DataNode,又叫”数据节点”

  • 1、DataNode:HDFS的Slave节点,存储文件实际的数据,负责将数据落入磁盘。所以DataNode节点需要较大的磁盘。
  • 2、DataNode在启动时会将自己发布到NameNode上,并上报自己持有的数据块表。定期向NameNode发送心跳,如果NameNode长时间没有接受到DataNode发送的心跳,NameNode就会认为该DataNode以及失效,将其剔除集群。心跳参数dfs.heartbeat.interval=3(默认3秒发送一次心跳)
  • 3、当某个DateNode宕机后,不会影响数据和集群的可用性。NameNode会安排其他DataNode进行副本复制接管他的工作。
  • 4、DataNode会定时上报自己负责的数据块列表。

Secondary NameNode “副手元数据节点”

SecondaryNameNode有两个作用,一是镜像备份,二是日志与镜像的定期合并。两个过程同时进行,称为checkpoint. 镜像备份的作用:备份fsimage(fsimage是元数据发送检查点时写入文件);日志与镜像的定期合并的作用:将Namenode中edits日志和fsimage合并,防止如果Namenode节点故障,namenode下次启动的时候,会把fsimage加载到内存中,应用edit log,edit log往往很大,导致操作往往很耗时。

四、HDFS操作流程

文件上传流程

  • 1、客户端发起写文件请求 hadoop fs -put
  • 2、nameNode检查上传文件的命名空间是否存在(就是检测文件目录结构是否存在),创建者是否有权限进行操作。然后返回状态高数客户端你可以上传数据
  • 3、客户端按照分块配置大小将文件分块。然后请求NameNode我要上传blk1,副本数是三个,这个文件一共分割了5块。
  • 4、NameNode检测自己管理下的DateNodes是否满足要求,然后返回给客户端三台DateNode节点信息(存储策略是机架模式)。
  • 5、Client端根据返回的DataNode信息选择一个离自己最近的一个DataNode节点,创建pipeLine(数据传输管道),DataNode1->DataNode2创建pipeLine,DataNode2->DataNode3创建pipeLine;DataNode3通过这一串管道传递给client数据传输管道已经建立完毕。
  • 6、client端创建Stream流(以packet为单位传输数据 64kb)上传数据。
  • 7、DataNode1接受并保持源源不断的packet,然后把packet源源不断的传递给DataNode2,DataNode2也做相应的操作。
  • 8、DataNode也通过pipeLine发送ACK认证数据是否接收完毕。
  • 9、第一个数据块上传完毕后client端开始上传第二个数据块

文件的获取流程

  • 1、client 发起 hadoop fs -get请求
  • 2、NomeNode检查该文件的信息,文件的分块信息和每个分块所对应哪个DateNode,,以及备份信息和备份信息所在哪个DataNode。把这些信息返回给client端。(返回原则也是机架原则,根据网络拓扑将距离最近的DataNode排在前边返回)
  • 3、根据NameNode的信息,请求各个文件块对应的DataNode节点获取文件数据。
  • 4、合并下载过来的数据块,形成一个完整的文件。

文章作者: Callable
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Callable !
评论
  目录