- 大数据:从基础理论到最佳实践
- 祁伟
- 3444字
- 2021-01-07 18:47:57
2.1 HDFS概述
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System, HDFS), HDFS是Apache Hadoop Core项目的一部分,是Hadoop兼容性最好的标准级分布式文件系统。
2.1.1 分布式文件系统
当今的信息时代中,人们可以获取的数据成指数倍地增长。单纯通过增加硬盘个数来扩展计算机文件系统的存储容量的方式,在容量大小、容量增长速度、数据备份、数据安全等方面都不适用,对于数据量很大的应用系统来说尤其如此。分布式文件系统可以有效解决数据的存储和管理难题。
分布式文件系统(Distributed File System, DFS)指通过一套管理系统,能够将文件分散至不同的计算机进行存储,并通过规范的标准协议,方便客户机进行高效存取。
与单机的文件系统不同,分布式文件系统不是将数据放在一块磁盘上由上层操作系统来管理,而是存放在一个服务器集群上,由集群中的服务器通过各尽其责、通力合作的方式提供整个文件系统的服务。将固定于某个地点的某个文件系统,扩展到任意多个地点/多个文件系统,这些节点组成一个文件系统网络。每个节点可以分布在不同的地点,通过网络进行节点间的通信和数据传输。人们在使用分布式文件系统时,无须关心数据是存储在哪个节点上,或者是从哪个节点获取的,只需要像使用本地文件系统一样管理和存储文件系统中的数据即可。
分布式文件系统中,重要的服务器包括:主控服务器(Master/NameNode)、数据服务器(一般称为ChunkServer或DataNode)和客户服务器(Client)。分布式文件系统的典型架构如图2-1所示。
图2-1 典型分布式文件系统的结构
1.分布式文件系统的特点
与传统文件系统相比,分布式文件系统具有以下主要特点。
(1)可扩展性强。扩展能力是一个分布式文件系统最重要的特点。基本上,所有的分布式文件系统都支持随时随地对数据服务器进行扩展,提升存储容量和访问带宽等。有的系统还支持多个目录/主控服务器。
(2)统一命名空间。采用统一命名空间,分布式文件系统对于客户端是完全透明的,客户端看到的是统一的全局命名空间,用户操作起来就像是管理本地文件系统。通过元数据管理,文件以块的方式采用多副本模式进行存放。
(3)高性能。由于一个文件被分成多份,保存在不同的数据服务器上,访问时,可以同时读取,性能会达到最优。
(4)高可用性。分布式文件系统必须具有高容错能力,即无论是客户端还是服务器出现故障,都不会影响整个系统的功能。为了做到这一点,单点失效是必须被避免的,例如使用资源冗余技术或者提供失效恢复服务。单个数据节点的故障并不会影响集群整体运转。
(5)弹性存储。可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行。弹性存储的最大挑战,是减小或增加资源时的数据震荡问题。
2.常见的分布式文件系统
分布式文件系统既有开源软件平台解决方案,如Hadoop HDFS、Fast DFS等;也有非开源平台解决方案,如最为著名的Google FS、也有像Windows Server 2003/2008平台上的DFS组件等。
分布式文件系统在当前应用普遍,产品种类丰富。下面介绍几种典型的系统。
(1)Lustre。
Lustre最早是由HP、Cluster File System联合美国能源部共同开发的Linux平台下的分布式集群文件系统,后期由于Cluster File System公司被Sun收购,而Sun又被Oracle收购,因此,Lustre官方网站目前挂靠在Oracle公司(http://wiki.lustre.org/index.php/Main_Page)。
Lustre主要面向超级计算机,拥有超强可扩展性与可靠性,能够支持上万个节点、PB级存储、100GB/s的高速访问能力。
Lustre采用GPL许可协议,属于开放源代码的分布式集群文件系统,开发语言采用C/C++,使用平台为Linux;当前,除了Oracle公司外,有新成立的名为Whamcloud的公司专注于Lustre平台的开源研发,其官方网站为http://www.whamcloud.com/。
(2)Google FS。
Google FS(Google File System)是谷歌公司开发的一个分布式可扩展的文件系统,它主要用于大型、分布式、大数据量的互联网应用平台。
Google FS被设计运行在廉价普通的PC服务器上,提供多数据副本实现数据冗余,通过数据分块并行存取,满足互联网用户的海量数据存储需求。
Google FS最早是由Google工程师于2003年发表的一篇学术文章The Google File System而为世人所熟知的,Google FS提供了相似的访问接口,如read、write、create、delete、close等,使得开发者可以非常方便地使用。
Google FS运行于Linux平台上,开发语言是C/C++,本身并不开源,本章中所介绍的Hadoop平台,是在受到Google FS启发后,采用其理念重新用Java语言实现的一个开源平台。
(3)Fast DFS。
Fast DFS是一个类Google FS的开源分布式文件系统,它由C/C++语言开发,可运行于Linux、Unix、AIX平台。Fast DFS提供专用文件存取访问方式,不支持POSIX接口方式,在系统中也不能使用mount方式挂接。FastDFS在架构上充分考虑了冗余备份、负载均衡、可扩展等问题,平台本身具有高可用、高性能等优点。Fast DFS支持文件的高效存储、同步、上传、下载等,比较适合于互联网视频网站、文档分享网站、图片分享网站等应用。
2.1.2 HDFS介绍
HDFS是Hadoop的核心子项目,是整个Hadoop平台数据存储与访问的基础,在此之上,承载其他如MapReduce、HBase等子项目的运转。
HDFS是类似于Google FS的开源分布式文件系统,被设计成适合运行在通用硬件上的分布式文件系统。它与现有的分布式文件系统有很多共同点。但同时,它与其他的分布式文件系统的区别也是很明显的。
HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。
HDFS是易于使用与管理的分布式文件系统,主要特点和设计目标如下。
1.硬件故障是常态
整个HDFS系统可以由数百或数千个存储着文件数据片段的服务器组成。实际上,它里面有非常巨大的组成部分,每一个组成部分都很可能出现故障,这就意味着HDFS里总是有一些部件是失效的,因此故障的检测和自动快速恢复是HDFS一个很核心的设计目标。
2.流式数据访问
HDFS被设计成适合批量处理的,而不是用户交互式的。POSIX的很多硬性需求对于HDFS应用都是非必需的,HDFS放宽了POSIX的要求,这样,可以实现以流的形式访问(Streaming Access)文件系统中的数据。同时去掉POSIX一小部分关键语义,可以获得更好的数据吞吐率。
3.简单的一致性模型
大部分HDFS程序对文件操作需要的是一次写、多次读取的操作模式。HDFS假定一个文件一旦创建、写入、关闭之后就不需要修改了。这简单化了数据一致的问题,并使高吞吐量的数据访问变得可能。
4.名字节点(NameNode)和数据节点(DataNode)
HDFS是一个主从结构,一个HDFS集群包括一个名字节点(也叫名称节点),它是一个管理文件命名空间和调节客户端访问文件的主服务器,当然,还有一些数据节点,通常是一个节点一个机器,它来管理对应节点的存储。HDFS对外开放文件命名空间,并允许用户数据以文件形式存储。内部机制是将一个文件分割成一个或多个块,这些块被存储在一组数据节点中。名字节点用来操作文件命名空间的文件或目录操作,如打开、关闭、重命名等。它同时确定块与数据节点的映射。数据节点负责来自文件系统客户的读写请求。数据节点同时还要执行块的创建、删除,以及来自名字节点的块复制指令。
5.大规模数据集
HDFS被设计为PB级以上存储能力,单个的存储文件可以是GB或者TB级。因此,HDFS的一个设计原则是支持成千上万大数据文件的存储,即将单个文件分成若干标准数据块,分布存储于多个节点上,当用户访问整个文件时,由这些节点集群向用户传输所拥有的数据块,由此可以获得极高的并行数据传输速率。
6.可移植性
HDFS在设计之初,就考虑到了异构软硬件平台间的可移植性,能够适应于主流硬件平台。它基于跨操作系统平台的Java语言进行编写,这有助于HDFS平台的大规模应用推广。
名字节点是整个HDFS的核心。一个标准的HDFS集群应由名字节点、备用名字节点、数据节点组成,HDFS的基本结构如图2-2所示。
图2-2 HDFS系统的基本结构
集群中,一台机器上只运行一个NameNode实例,而集群中其他机器分别运行一个DataNode实例。NameNode是一个中心服务器,负责管理文件系统的名字空间以及客户端对文件的访问,用户能够以文件的形式在上面进行名字空间操作,比如打开、关闭、重命名文件或目录,同时,NameNode还决定了数据块到数据节点的映射关系。NameNode也可以称为管理文件系统的元数据。集群中,每一个节点配置一个DataNode,每个DataNode负责管理它所在节点上的数据存储。从内部看,一个文件被分成一个或多个数据块,这些块存储在一组DataNode上。同时,DataNode负责处理文件系统客户端的读写请求,在NameNode的统一调度下进行数据块的创建、删除和复制。
HDFS的数据块:磁盘存储文件时,是按照数据块(block)来存储的,也就是说,数据块是磁盘读/写的最小单位。数据块也称磁盘块。在HDFS中也有块的概念,默认为64MB,每个块作为独立的存储单元。
基于数据块的存储方式非常适合用于备份,可提供数据容错能力和可用性(如图2-3所示)。HDFS提供给应用程序例如MapReduce数据服务。一般来说,MapReduce的Map任务通常一次处理一个块中的数据,如果任务数太少(少于集群中节点的数量),就没有发挥多节点的优势,甚至作业的运行速度就会与单节点一样。
图2-3 HDFS块副本