Hadoop的核心组件HDFS(分布式文件系统HDFS)

                                     

                                                      Hadoop的核心组件HDFS(分布式文件系统HDFS)

 HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,在大数据开发中分布式计算对海量数据进行存储与管理。它基于流数据模式访问和处理超大文件的需求而开发,可以运行在廉价的商用服务器上,为海量数据提供了不怕故障的存储方法,进而为超大数据集的应用处理带来了很多便利.

下面是HDFS的一些显著特征:

HDFS非常适合使用商用硬件进行分布式存储和分布式处理。它具有容错性,可拓展性,并且扩展极其简单.

HDFS具有高度可配置性。大多数情况下,需要仅针对非常大的集群调整默认配置。

HDFS是Hadoop的核心架构,而Hadoop是用Java编写的,因此可以运行于所有的主流平台上.

支持类似Shell的命令直接与HDFS交互.

HDFS内置了Web服务器,可以轻松检查集群的当前状态.

 

HDFS的主要设计目标如下。

(1)硬件故障

硬件故障是常态,而非例外。HDFS集群可能由数百或数千台服务器组成,每台服务器都存储文件系统数据的一部分,且每台服务器都有很大的故障概率。因此,故障检测和快速,自动地从故障中恢复是HDFS的核心架构目标.

(2)流失数据访问

在HDFS上运行的应用程序需要对其数据集进行流式访问,这与运行在一般文件系统上的应用不同。HDFS更适合批量处理,而不是用户的交互使用,它更加强调数据访问的高吞吐量,而不是数据访问的低延迟.

(3)大型数据集

HDFS是一个支持大型数据集的文件系统,一个典型的HDFS数据文件可以从千兆字节到兆兆字节不等,可以为具有数百个节点的集群提供高聚合的数据带宽和规模,同时承载千万个文件.

(4)简单一致性模型

HDFS遵循简单一致性模型,一次写入,多次读取。即文件一旦被建立,写入,关闭,就不能被改变,更不能从文件任意位置进行修改,以此来保证数据的一致性.Hadoop 2.x以后,支持在文件未位追加内容.

(5) 移动计算比移动数据容易

HDFS被设计为能更好地将计算迁移到更接近数据的位置,而不是将数据移动到应用程序运行的位置,这样应用程序的计算效率会更高。HDFS为应用程序提供接口,使其更接近数据所在的位置.

(6)平台的可移植性

HDFS被设计为可以从一个平台轻松地移植到另外一个平台,从而使HDFS能够作为大型应用程序的首选平台。

 

总体架构

HDFS是使用Java语言构建的系统,任何支持Java的计算机都可以运行HDFS,HDFS集群的总体架构如下图所示.

 

                                  

 

HDFS是一个典型的主/从(Master/Slave)架构的分布式系统。一个HDFS集群由一个元数据节点(称为NameNode)和一些数据节点(称为DataNode)组成,NameNode是HDFS的主节点是一个用来管理文件元数据(文件名称,大小,存储位置等)和处理来自客户端的文件访问请求的主服务器;DataNode是HDFS的从节点,用来管理对应的数据存储,即实践文件数据存储于DataNode上,而DataNode中的数据则保存在本地磁盘.

 

当HDFS系统启动后,NameNode上会启动一个名称为”NameNode”的进程,DataNode上会启动一个名称为”DataNode”的进程.

 

典型的HDFS集群部署是有一台专用的计算机只运行NameNode进程,集群中的其他计算机都运行DataNode进程。HDFS架构并不排除在同一台计算机上运行多个DataNode进程,但在实际部署中很少出现这种情况。

HDFS集群中单个NameNode的存在极大地简化了系统的体系架构。NameNode是HDFS元数据的仲裁者和存储库。该系统的设计方式是,用户数据永远不会流经NameNode。

此外,还有一个重要组件称为SecondaryNameNode,该组件接下来会介绍。

 

 

HDFS系统的主要构成组件介绍如下:

1.数据块(Block)

HDFS中的文件是以数据块(Block)的形式存储的,默认最基本的存储单位是128MB(Hadoop1.x为64MB)的数据块。也就是说,存储在HDFS中的文件都会被分割成128MB一块的数据块进行存储,如果文件本身小于一个数据块的大小,则按实际大小存储,并不占用整个数据块空间。

HDFS的数据块之所以会设置过大,其目的是减少寻址开销。数据块数量越多,寻址数据块所耗的时间就越多。当然也不会设置过大,MapReducer中的Map任务通常一次只处理一个块中的数据,如果任务数太少,作业的运行速度就会比较慢。

HDFS的每一个数据块默认都有三个副本,分别存储在不同的DataNode上,以实现容错功能。因此,若数据块的某个副本丢失并不会影响对数据块的访问,数据块大小和副本数量可在配置文件中更改。HDFS数据块的存储结构如下图所示:

 

                                               

  1. NameNode

   NameNode 是HDFS中存储元数据(文件名称,大小和位置等信息)的地方,它将所有文件和文件夹的元数据保存在一个文件系统目录树中,任何元数据信息的改变,NameNode都会记录。

HDFS中的每个文件都被拆分为多个数据块存放,这种文件与数据块的对应关系也存储在文件系统目录树中,由NameNode维护。

   NameNode还存储数据块到DataNode的映射信息,这种映射信息包括:   数据块存放在哪些DataNode上,每个DataNode上保存了哪些数据块。

   NameNode也会周期性地接收来自集群中DataNode的”心跳”和”块报告”。通过”心跳”与DataNode保持通信,监控DataNode的状态(活着还是岩机),若长时间接收不到”心跳”信息,NameNode会认为DataNode已经岩机,从而做出相应的调整策略。”块报告”包含了DataNode上所有数据块的列表信息。

 

      2. DataNode

DataNode是HDFS中真正存储数据的地方。客户端可以想DataNode请求写入或读取数据块,DataNode还在来自NameNode的指令下执行块的创建,删除和复制,并且周期性地向NameNode汇报数据块信息。

 

       3. SecondaryNameNode

SecondaryNameNode用于帮助NameNode管理元数据,从而使NameNode能够快速,高效地工作。它并不是第二个NameNode,仅是NameNode的一个辅助工具。

HDFS的元数据信息主要存储于两个文件中:fsimage和edits。fsimage是文件系统映射文件,主要存储文件元数据信息,其中包括文件系统所有目录,文件信息以及数据块的索引;edits是HDFS操作日志文件,HDFS对文件系统的修改日志会存储到该文件中。

当NameNode启动时,会从文件fsimage中读取HDFS的状态,也会对文件fsimage和edits进行合并,得到完整的元数据信息,随后会将新HDFS状态写入fsimage。但是在繁忙的集群中,edits文件会随着时间的推移变得很大,这导致NameNode下一次启动的时间会非常长。为了解决这一问题,则产生了SecondaryNameNode,SecondaryNameNode会定期协助NameNode合并fsimage和edits文件,并使edits文件的大小保持在一定的限制内。SecondaryNameNode通常与NameNode在不同的计算机上运行,因为它的内存需求与NameNode相同,这样可以减轻NameNode所在计算机的压力。

 

SecondaryNameNode的工作流程如下图所示:

 

                                    

首先,当SecondaryNameNode准备从NameNode上获取元数据时,会通知NameNode暂停对文件edits的写入。NameNode收到通知后,会停止写入edits文件,而是将新的操作日志信息写入到一个新的文件edits.new中。

然后,SecondaryNameNode通过http get方式将NameNode的元数据文件edits和fsimage获取到本地,并将其合并为一个新的文件fsimage.ckpt。

最后,SecondaryNameNode把新的文件fsimage.ckpt通过http post方式发回NameNode。NameNode收到SecondaryNameNode发回的新文件fsimage.ckpt后,用该文件覆盖掉原来的fsimage文件,并删除原有的edits文件,同时将文件edits.new重命名为edtis,将文件fsimage.ckpt重命名为fsimage。

上述操作避免了NameNode日志的无限增长,从而加速了NameNode的启动过程。

5.   文件读写

   如下图,当客户端需要读取文件时,首先向NameNode发起读请求,NameNode收到请求后,会将请求文件的数据块在DataNode中的具体位置(元数据信息)返回给客户端,客户端根据文件数据块的位置,直接找到相应的DataNode发起读请求。

                                       

 

如下图所示,当客户端需要文件时,首先向NameNode发起写请求,将需要写入的文件名,文件大小等信息告诉NameNode。NameNode会将文件信息记录到本地,同时会验证客户端的写入权限,若验证通过,会向客户端返回文件数据块能够存放在DataNode上的存储位置信息,然后客户端直接向DataNode的相应位置写入数据块。被写入数据块的DataNode也会将数据块备份到其他DataNode上。

                                         

     

 

                                 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值