3.1 HDFS 简介

任务目的

  • 了解传统文件系统到分布式文件系统的演变过程
  • 理解 HDFS 中重要角色的相关概念
  • 理解 HDFS 的优缺点

任务清单

  • 任务1:HDFS 的演变
  • 任务2:HDFS 的基本概念
  • 任务3:HDFS 特点

详细任务步骤

任务1:HDFS 的演变

  HDFS 源于Google在2003年10月份发表的GFS(Google File System)论文,接下来从传统的文件系统入手,开始学习分布式文件系统,以及分布式文件系统是如何演变而来。

  传统的文件系统对海量数据的处理方式是将数据文件直接存储在一台服务器上。如下图所示:

Vditor

图1

  从上图可以看出,传统的文件系统在存储数据时,会遇到两个问题,具体如下:

  • 当数据量越来越大时,会遇到存储瓶颈,就需要扩容;
  • 由于文件过大,上传和下载都非常耗时。

  为了解决传统文件系统遇到的存储瓶颈问题,首先考虑的就是扩容,扩容有两种形式,一种是纵向扩容,即增加磁盘和内存;另一种是横向扩容,即增加服务器数量。通过扩大规模达到分布式存储,这种存储形式就是分布式文件存储的雏形,如下图所示:

Vditor

图2

  解决了分布式文件系统的存储瓶颈问题之后,还需要解决文件上传与下载的效率问题,常规的解决办法是将一个大的文件切分成多个数据块,将数据块以并行的方式进行存储。这里以30G的文本文件为例,将其切分成3块,每块大小10G(实际上每个数据块都很小,只有100M左右),将其存储在文件系统中,如下图所示:

Vditor

图3

  从上图可以看出,原先一台服务器要存储30G的文件,此时每台服务器只需要存储10G的数据块就完成了工作,从而解决了上传下载的效率问题。但是文件通过数据块分别存储在服务器集群中,那么如何获取一个完整的文件呢?

  针对这个问题,就需要再考虑增加一台服务器,专门用来记录文件被切割后的数据块信息以及数据块的存储位置信息,如下图所示:

Vditor

图4

  从上图可以看出,文件存储系统中增加了一台服务器D用于管理其他服务器,服务器D记录着文件被切分成多少个数据块,这些数据块分别存储在哪台服务器中,当客户端访问服务器D请求下载数据文件时,就能够通过类似查找目录的方式查找数据了。

  通过前面的操作,看似解决了所有的问题,但其实还有一个非常关键的问题需要处理,那就是当存储数据块的服务器中突然有一台机器宕机,就无法正常的获取文件了,这个问题被称为单点故障。针对这个问题,可以采用备份的机制解决。如下图所示:

Vditor

图5

  从上图可以看出,每个服务器中都存储两个数据块,进行备份。服务器A存储blk-001和blk-002,服务器B存储blk-002和blk-003,服务器C存储blk-001和blk-003。当服务器B突然宕机,我们还可以通过服务器A和服务器C查询完整的数据块供客户端访问下载。这就形成了简单的HDFS。

  这里的服务器D被称为NameNode,它维护着文件系统内所有文件和目录的相关信息,服务器A、B、C被称为DataNode,用于存储数据块

任务2:HDFS 的基本概念

  HDFS(Hadoop Distributed File System)是一个易于扩展的分布式文件系统,运行在成百上千台低成本的机器上。它与现有的分布式文件系统有许多相似之处,都是用来存储数据的系统工具

  首先,它是一个文件系统,用于存储文件,通过统一的命名空间——目录树来定位文件。例如:

  • hdfs://namenode:port/dir-a/dir-b/dir-c/file.data
  • hdfs://localhost:9000/soft/hadoop-2.7.7.tar.gz

  其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器都有各自清晰的角色定位

  1. NameNode(名称节点)

  NameNode 是 HDFS 集群的主服务器,通常称为名称节点或者主节点一旦NameNode关闭,就无法访问Hadoop集群。

  NamNode主要以元数据的形式进行管理和存储,用于维护文件系统名称并管理客户端对文件的访问;

  NameNode 记录对文件系统名称空间(namespace)或其属性的任何更改操作;

  HDFS 负责整个数据集群的管理,并且在配置文件中可以设置备份数量,这些信息都由 NameNode 存储。

  2. DataNode(数据节点)

  DataNode是HDFS集群中的从服务器,通常称为数据节点

  文件系统存储文件的方式是将文件切分成多个数据块,这些数据块实际上是存储在DataNode节点中的,因此DataNode机器需要配置大量磁盘空间。

  它与NamNode保持不断的通信,DataNode在客户端或者NameNode的调度下,存储并检索数据块,对数据块进行创建、删除等操作,并且定期向NameNode发送所存储的数据块列表,每当DataNode启动时,它将负责把持有的数据块列表发送到NameNode机器中。

  3. Block(数据块)

  每个磁盘都有默认的数据块大小,这是磁盘进行数据读/写的最小单位

  HDFS同样也有块(Block)的概念,在Hadoop2.x版本中,默认一个块的大小是128M,且备份3份,每个块尽可能地存储于不同的DataNode中。

  要在HDFS中存储的文件可以划分为多个分块,每个分块可以成为一个独立的存储单元。与本地磁盘不同的是,HDFS中小于一个块大小的文件并不会占据整个HDFS数据块。

  按块存储的好处主要有:

  (1)一个文件的大小可以大于网络中任意一个磁盘的容量。文件的所有块并不需要存储在同一个磁盘上,因为他们可以利用集群中的任意一个磁盘进行存储。

  (2)使用抽象的块,而不是整个文件作为存储单元,可以简化存储管理,使得文件的元数据可以单独管理。

  (3)冗余备份。数据块非常适合用于数据备份,进而可以提供数据容错能力和提高可用性。每个块可以有多个备份(默认为三个),分别保存到相互独立的机器上去,这样就可以保证单点故障不会导致数据丢失。

  4. Rack(机架)

  Rack 是用来存放部署 Hadoop 集群服务器的机架,不同机架之间的节点通过交换机通信,HDFS通过机架感知策略,使NameNode能够确定每个DataNode所属的机架ID,使用副本存放策略,来改进数据的可靠性、可用性和网路带宽的利用率。

Vditor

图6

  5. Metadata(元数据)

  元数据从类型上可分为三种信息形式,分别是:

  (1)维护HDFS中文件和目录的信息,如文件名、目录名、父目录信息、文件大小、创建时间、修改时间等;

  (2)记录文件内容,存储相关信息,如文件分块情况、副本个数、每个副本所在的DataNode信息等;

  (3)用来记录HDFS中所有DataNode的信息,用于DataNode管理。

任务3:HDFS 特点

3.1 HDFS 优点

  1. 高容错性

  HDFS可以由成百上千服务器组成,每个服务器存储文件系统数据的一部分。

  (1)数据自动保存多个副本:HDFS中的副本机制会自动把数据保存多个副本。

  (2)副本丢失后,自动恢复:DataNode节点周期性地向NameNode发送心跳信号,当网络发生异常,可能导致DataNode与NameNode失去通信,NameNode和DataNode通过心跳检测机制,发现DataNode宕机,DataNode中副本丢失,HDFS则会从其他DataNode上面的副本自动恢复,所以HDFS具有较高的容错性。

  2. 流式数据访问

  HDFS的数据处理规模比较大,应用程序一次需要访问大量的数据,同时这些应用程序一般都是批量地处理数据,而不是用户交互式处理,所以应用程序能以流的形式访问数据集,请求访问整个数据集要比访问一条记录更加高效。

  3. 支持超大文件

  HDFS具有很大的数据集,旨在可靠地大型集群上存储超大型文件(GB、TB、PB级别的数据),它将每个文件切分成多个小的数据块进行存储,除了最后一个数据块之外的所有数据块大小都相同,块的大小可以在hdfs-site.xml配置文件中进行修改,在Hadoop2.x版本中默认大小是128M

  4. 高数据吞吐量

  HDFS采用的是“一次写入,多次读取”这种简单的数据一致性模型,在HDFS中,一个文件一旦经过创建、写入、关闭后,就不能进行修改了,只能进行追加,这样保证了数据的一致性,也有利于提高吞吐量。

  5. 可构建在廉价的机器上

  Hadoop的设计对硬件要求低,无须构建在昂贵的高可用性机器上,因为在HDFS设计中充分考虑了数据的可靠性、安全性和高可用性。

3.2 HDFS 缺点

  1. 高延迟

  HDFS不适用于低延迟数据访问的场景,例如,毫秒级实时查询。

  2. 不适合小文件存取场景

  对于Hadoop系统,小文件通常定义为远小于HDFS的数据块大小(128M)的文件,由于每个文件都会产生各自的元数据,Hadoop通过NameNode来存储这些信息,若小文件过多,容易导致NameNode存储出现瓶颈

  3. 不适合并发写入

  HDFS目前不支持并发多用户的写操作,写操作只能在文件末尾追加数据

猜你喜欢

转载自blog.csdn.net/c_lanxiaofang/article/details/107805314
3.1