HDFS基础知识(设计目标,相关概念,可靠性保障,读写,优缺点)

一,HDFS出现的背景

虽然硬盘存储容量在不断提升,但是访问速度(I/O)跟不上,解决办法是数据存储在多个硬盘,同时对多个硬盘的数据并行读写。
这样需要解决两个问题:一是硬件故障问题,二是分析任务需要结合不同来源的数据。
于是,Hadoop提供了一个可靠的共享存储和分析系统:HDFS实现数据的存储,MapReduce实现数据的分析和处理。
作为Hadoop的核心技术之一,HDFS(Hadoop Distributed File System,Hadoop分布式文件系统)是分布式计算中数据存储管理的基础。它所具有的高容错、高可靠、高可扩展性、高吞吐率等特性为海量数据提供了不怕故障的存储,也为超大规模数据集(Large Data Set)的应用处理带来了很多便利。

二,HDFS的设计前提与目标

  1. 硬件错误是常态而不是异常

    HDFS被设计为运行在众多的普通硬件上,所以硬件故障是很正常的。因此,错误检测并快速恢复是HDFS最核心的设计目标。

  2. 流式数据访问。

    HDFS的设计建立在“一次写入、多次读取”的基础上。一个数据集由数据源生成或复制而来,然后响应各种各样的数据分析任务请求,每次分析都涉及该数据集的大部分数据甚至全部,因此读取整个数据集的时间延迟比读取第一条记录的时间延迟更重要。

  3. 大规模数据集。

    HDFS的文件大小都在GB甚至TB级别。

  4. 简单一致性模型。

    由于HDFS采用“一次写入,多次读取”的访问模式,所以文件一经创建、写入和关闭之后就不需更改了,简化了数据一致性问题,使高吞吐量的数据访问成为可能。

  5. 移动计算比移动数据更为划算。

    对于大文件来说,移动计算比移动数据的代价要低,在数据旁边进行操作效率会比较高,尤其是数据量大时,这样可以减少网络拥塞和提高吞吐量,所以把计算迁移到数据附近更好,而不是把数据传输到程序运行的地方。

三 ,HDFS相关概念

1,数据块

在单一磁盘的文件系统中,每个磁盘都有默认的数据块大小,这是磁盘进行数据读/写的最小单位。HDFS同样也有块(block)的概念,但是大得多,默认是64MB。与单一磁盘上的文件系统相似,HDFS上的文件也被划分为块大小的多个分块(chunk),作为独立的存储单元。但与其他文件系统不同的是,HDFS中小于一个块大小的文件不会占据整个块的空间。
为何HDFS中的块如此之大?其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。因而,传输一个由多个块组成的文件的时间取决于磁盘传输速率。以后随着新一代磁盘驱动器的传输速率的提升,块的大小将被设置的更大。

对分布式文件系统中的块进行抽象会带来很多好处。第一个最明显的好处是,一个文件的大小可以大于网络中任意一个磁盘的容量。文件的所有块并不需要存储在同一个磁盘上,因此他们可以利用集群上的任意一个磁盘进行存储。
第二个好处是,使用抽象块而非整个文件作为存储单元,大大简化了存储子系统的设计。块只是存储数据的一部分,而文件的元数据并不需要和块一同存储,其他系统可以单独管理这些元数据。同时,块适合用于数据备份进而提高容错能力,将每个块复制到少数几个独立的机器上(默认3个),如果一个不可用,还能读另一个。

2,NameNode和DataNode

NameNode管理文件系统的命名空间。NameNode维护两套数据:一套是文件目录与数据块之间的映射关系,另一套是数据块与节点间的关系。前一套是静态的,是存放在磁盘上的,通过命名空间镜像文件(fsimage)和编辑日志文件(edits)来维护;后一套数据时动态的,不持久化到磁盘,每当集群启动的时候,会自动建立这些信息。
NameNode管理文件系统的元数据,多个DataNode存储实际的数据。客户端通过同NameNode和DataNode的交互访问文件系统(客户端联系NameNode以获取文件的元数据,而真正的I/O操作是直接和DataNode进行交互的)。

DataNode是文件系统的工作节点。他们根据需要存储并检索数据块(受客户端或NameNode调度),并且定期向NameNode发送他们所存储的块的列表。没有NameNode,文件系统将无法使用。事实上,如果运行NameNode服务的集群毁坏,文件系统上所有的文件将会丢失,因为我们不知道如何根据DataNode的块重建那个文件。

因此,对NameNode实现容错非常重要,在Hadoop 1.x中的NameNode只可能有一个,虽然可以通过SecondaryNameNode与NameNode进行数据同步备份,但是总会存在一定的时延,如果NameNode挂掉,但是如果有部份数据还没有同步到SecondaryNameNode上,还是可能会存在着数据丢失的问题。在2.x版本中引入HA解决了此单点故障问题。
(注:SecondaryNameNode是一种容错机制,定期通过编辑日志合并命名空间镜像,在NameNode故障时启用。另一种容错机制是把元数据写入本地磁盘的同时,写入另一个文件系统中。)

3,联邦HDFS

NameNode在内存中保存文件系统中每个文件和每个数据块的引用关系,所以内存是限制系统横向扩展的瓶颈,在Hadoop 2.x中引入的联邦HDFS允许系统通过添加NameNode实现横向扩展,其中每个NameNode管理文件系统命名空间中的一部分。在联邦环境下,每个NameNode维护一个命名空间卷(namespace volume),包括命名空间的元数据和在该命名空间下的文件的所有数据块的数据块池。命名空间卷之间是相互独立的,其中一个NameNode失效不影响另一个。数据块池不再进行切分,因此集群中的DataNode需要注册到每个NameNode,并且存储来自多个数据块池中的数据块。所以联邦主要解决内存不足问题

4,HDFS的高可用性(HA)

Hadoop 2.x版本针对1.x版本的单点故障问题,在HDFS中增加了对高可用性(HA)的支持。HDFS的HA主要指的是可以同时启动2个NameNode。其中一个处于工作(Active)状态,对外提供服务,另一个处于随时待命(Standby)状态,同步主节点的元数据。所有的NameNode共享所有DataNode存储资源。这样,当一个NameNode所在的服务器宕机时,可以在数据不丢失的情况下,手工或者通过zookeeper(进行心跳监控,因采用投票机制必须是奇数个)自动切换到另一个NameNode提供服务。如下图所示,它展示了在Hadoop2下实现HA的结构:
HDFS基础知识(设计目标,相关概念,可靠性保障,读写,优缺点)_第1张图片
其中的JN:JournalNode集群,存储元数据,所有NameNode从这里读写元数据。
FailoverController:必须和NameNode对应,进行心跳检查,控制NameNode切换。

四,保障HDFS的可靠性措施

HDFS具备了较为完善的冗余备份和故障恢复机制,可以实现在集群中可靠地存储海量文件。

  1. 冗余备份。

    为了容错,文件的所有数据块都可以有副本(replication默认3个)。当DataNode启动的时候,它会遍历本地文件系统,产生一份HDFS数据块和本地文件对应关系的列表,并把这个报告发送给NameNode,这就是报告块(BlockReport),报告块上包含了DataNode上所有块的列表。

  2. 副本存放。

    HDFS集群一般运行在多个机架上,不同机架上机器的通信需要通过交换机,机架内节点之间的带宽比跨机架节点之间的带宽要大。HDFS的存放策略是将一个副本存放在本地机架节点上,一个副本存放在同一个机架的另一个节点上,最后一个副本放在不同机架的节点上。这种机架感知(Rack-aware)的策略减少了机架间的数据传输,提高了写操作的效率。机架的错误远远比节点的错误少,所以这种策略不会影响到数据的可靠性和可用性。

  3. 心跳检测。

    NameNode周期性地从集群中的每个DataNode接受心跳包和块报告,如果DataNode不能发送心跳信息,NameNode会标记最近没有心跳的DataNode为宕机,并且不会给他们发送任何I/O请求,同时采取数据备份措施。

  4. 数据完整性监测。

    NameNode在创建HDFS文件时,会计算每个数据的校验和并储存起来。当客户端从DataNode获取数据时,他会将获取的数据的校验和与之前储存的校验和进行对比。

  5. 空间回收。

    从HDFS中删除的文件会首先被放入到/trash中,/trash文件夹中的内容是被删除文件最后的副本,该文件夹会被定时清空。该文件夹中不存在的文件就彻底不存在了。

  6. 安全模式。

    HDFS启动时,会进入安全模式,此时不允许写操作。这时,NameNode会收到所有DataNode节点的数据块报告,在确认安全之后,系统自动退出安全模式。

  7. 核心文件备份。

    HDFS的核心文件是映像文件和事务日志,系统支持对这两个文件的备份,以确保NameNode宕机后的恢复。

  8. 快照。

五,HDFS的读写操作

读操作:

客户端要访问一个文件,首先,客户端从NameNode中获得组成该文件数据块位置列表,即知道数据块被存储在哪几个DataNode上;然后,客户端直接从DataNode上读取文件数据。在此过程中,NameNode不参与文件的传输。如下图:
HDFS基础知识(设计目标,相关概念,可靠性保障,读写,优缺点)_第2张图片

写操作:

客户端首先需要向NameNode发起写请求,NameNode会根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息。最后,Client将文件划分为多个文件块,根据DataNode的地址信息,按顺序写入到每一个DataNode块中。如下图:
HDFS基础知识(设计目标,相关概念,可靠性保障,读写,优缺点)_第3张图片

六,HDFS优缺点

优点:

  1. 处理超大文件:指百MB、甚至数百TB大小的文件。目前在实际应用中,HDFS已经能用来存储管理PB级的数据了。
  2. 流式访问数据:与HDFS的设计目标一致。
  3. 运行于廉价的商用机器集群上

缺点:

  1. 不适合低延迟数据访问。

    如果要处理一些低延迟应用请求(毫秒级),则HDFS不适合。HDFS是为了处理大型数据集分析任务的,主要是为达到高的数据吞吐量而设计的,这就可能要求以高延迟作为代价。对于低延迟的访问需求,HBase是更好的选择。

  2. 无法高效存储大量小文件。

    因为Namenode把文件系统的元数据放置在内存中,所以文件系统所能容纳的文件数目是由Namenode的内存大小来决定。一般来说,每一个文件、文件夹和Block需要占据150字节左右的空间,所以,如果你有100万个文件,每一个占据一个Block,你就至少需要300MB内存。当前来说,数百万的文件还是可行的,当扩展到数十亿时,对于当前的硬件水平来说就没法实现了,同时有个问题是寻道时间大于读取时间。利用SequenceFile归档小文件是个改善办法,HBase就是基于此。

  3. 不支持多用户写入及任意修改文件。

    在HDFS的一个文件中只有一个写入者,而且写操作只能在文件末尾完成,即只能执行追加操作。目前HDFS还不支持多个用户对同一文件的写操作,以及在文件任意位置进行修改。

你可能感兴趣的:(Hadoop)