首页 > 代码库 > HDFS概述

HDFS概述

HDFS特点概述

Hadoop整合抽象了众多的文件系统类,HDFS只是其中一种的具体实现。它是基于流数据模式和处理超大文件的需求开发的,主要特点如下:

  1. 处理超大文件

这里的超大文件通常是指MB到TB级别的数据文件,在实际应用中已经可达到PB级。

  1. 流式地访问数据

HDFS提供一次写入,多次读取的服务。一个数据集一旦提交,会复制分发到不同数据节点上,大多数数据分析任务都会涉及数据集中的大多数数据,请求读取整个数据集比请求读取某条数据更高效。

  1. 运行于廉价机器上

由于hadoop的设计对硬件要求并不高,节点可能是非常廉价的机器,节点故障率可能很高。这就要求HDFS考虑安全性,可靠性,高可用性。所以HDFS存在下述弱点:

  • 不适合低延迟访问:HDFS不适合处理一些低延迟应用请求,它是为了处理大型数据集分析任务而设计的,为了达到高数据吞吐量,需要以高延迟为代价。这需要其他方案来弥补。
  • 无法高效存储大量小文件:HDFS中文件系统的元数据存于内存并由NameNode来管理,文件个数越多, NameNode工作夜里越大。
  • 不支持多用户写入和任意修改文件:HDFS的文件只能有一个写入者,且写操作只能在文件结尾处完成,即只能进行追加操作。

HDFS相关概念

传统操作系统中的块是操作文件的基本单位,大小通常是一个扇区512B。HDFS中文件也分块存储,但是它是抽象的块,是处理文件的逻辑单元,默认64MB(1.0),或128(MB)。抽象的文件块之所以这么大,就是为了处理大文件而设计,好处如下:

  • 逻辑块的设计使得超大文件的存储不再受到单个节点磁盘空间的限制,可以将文件切分成众多块,分别存在不同集群上。
  • HDFS块的大小固定,简化了数据存储的管理,特别是元数据信息和数据块可以分开存储,更有利于复制容错的实现,也可以提高操作频率高的文件块的副本数,以提高吞吐量。

节点

  • NameNode承担master的任务,管理文件系统的命名空间,维护整个文件系统的目录树以及文件的索引目录。这些元数据信息以两种形式存在本地文件系统中:命名空间镜像(fsimage)和编辑日志。元数据信息还包括了件基本信息(文件名,目录结构,副本数,权限等等),文件的块列表(文件所在的块信息),块所在datanode的信息等。这些信息并不是永久保留的,NameNode每次启动时会重建这些信息。任务运行时,Client通过NameNode获取这些元数据信息,从而访问整个文件系统。
  • DataNode承担slave的任务,执行具体任务:存储文件块以及块数据的校验和,被NameNode和客户端调用。同时会通过心跳定时向NameNode发送文件块信息。
  • SecondaryNameNode用于监控HDFS状态的辅助后台程序,每隔一段时间来获取HDFS元数据的快照,同步元数据与日志。

?

HDFS体系结构

HDFS采用Master/Slave的架构,即由一个NameNode和若干个DataNode构成。NameNode是一个中心服务器,提供管理文件命名空间和客户端访问的服务,它执行文件命名空间的操作,比如文件的打开,关闭,重命名文件或目录,也负责文件块到DataNode的映射。集群中一般一个节点上运行一个DataNode进程,负责管理该节点的存储的文件块,负责对文件的读写请求,在NameNode的统一调度下,完成对数据块的创建,删除和复制

副本的存放与复制

副本的存放与复制是HDFS可靠性和性能的关键,优化的副本存放策略使得HDFS区别于其他分布式文件系统。HDFS通过机架感知(Rack-Ware)的策略来改进数据可靠性,可用性和网络带宽的利用率。大型HDFS实例运行于跨越多个机架的集群上,不通机架上的计算机通信需要经过交换机,通信成本较大。通过机架感知策略,NameNode可以确定每个DataNode所在的机架ID,HDFS将文件副本放在不同的机架上,有效防止了整个机架数据的丢失,也使读取数据时充分利用机架带宽。但是,进行写操作时就需要传输数据块到多个机架。

HDFS默认的副本数为3,存放策略是将一个副本放在本地机架,第二个副本放在同一个机架的另外一个节点上,第三份放在不同机架的节点上。该策略相当于数据分成三份存于两个机架上,这样的策略提高了写操作的效率,也减少了机架间的传输。机架间的错误比节点间的错误要少,所以保证了可靠性和可用性的同时改进了写操作的性能。

读取数据时,根据机架感知策略,HDFS会让读取程序尽量读取离客户端比较近的机架,以便减少整体带宽的消耗。如果和读取程序在同一个机架上有一个副本,则读取该副本。

安全模式

NameNode在启动后会进入安全模式状态,该状态下NameNode不会进行数据块的复制。NameNode会从所有DataNode接收心跳信号和块状态报告。块状态报告包括某个DataNode的数据块列表。每个数据块都有最小的副本数。当NameNode检测到某个数据块副本数目大于等于最小时候,该数据块被认为是副本安全的;在一定百分比(可设置参数)的数据块被确认是安全后(加上30s等待时间),NameNode退出安全模式。随后,NameNode还会确认哪些数据块还没有达到副本安全,并将它们复制到其他节点上。

文件安全

由于Master/Slave的架构特性,如果NameNode出现故障,则整个文件系统都会丢失。采用以下两种机制确保NameNode的安全:

  1. 备份NameNode上的持久化存储的元数据文件,并转移到其他文件系统上去,这种转储是同步的,原子性的。
  2. 系统中同步运行SecondaryNameNode,周期性的合并编辑日志中的命名空间镜像,以避免编辑日志过大。SecondaryNameNode的运行需要大量的CPU和内存资源去做合并操作,需要单独运行在一台机器上。这台机器会存储合并过的命名空间镜像,以便在NameNode宕机后能够恢复,但这样的备份总是滞后的,所以损失是必然的。详细内容以后再介绍。

HDFS概述