竹笋

首页 » 问答 » 灌水 » HDFS文件系统
TUhjnbcbe - 2023/5/7 22:30:00

本期介绍Hadoop的核心组成部分HDFS文件系统,包括其原理、安装与配置、管理及外部编程接口等。通过对本期内容的学习,使读者掌握分布式文件系统的主要结构、HDFS文件系统的内部运行原理和机制、HDFS的数据读写方式,同时,了解HDFS文件系统的数据传输和存储模式。

下期将详细介绍Hadoop的安装和基本配置。通过本期和下一期的学习,读者可以搭建自己的Hadoop集群。

本期要点

■HDFS文件系统的结构与组成

■HDFS系统的数据读写

■HDFS系统的数据存储及数据完整性

1.HDFS概述

Hadoop实现了一个分布式文件系统(HadoopDistributedFileSystem,HDFS),HDFS是ApacheHadoopCore项目的一部分,是Hadoop兼容性最好的标准级分布式文件系统。

1.1分布式文件系统

当今的信息时代中,人们可以获取的数据成指数倍地增长。单纯通过增加硬盘个数来扩展计算机文件系统的存储容量的方式,在容量大小、容量增长速度、数据备份、数据安全等方面都不适用,对于数据量很大的应用系统来说尤其如此。分布式文件系统可以有效解决数据的存储和管理难题。

分布式文件系统(DistributedFileSystem,DFS)指通过一套管理系统,能够将文件分散至不同的计算机进行存储,并通过规范的标准协议,方便客户机进行高效存取。

与单机的文件系统不同,分布式文件系统不是将数据放在一块磁盘上由上层操作系统来管理,而是存放在一个服务器集群上,由集群中的服务器通过各尽其责、通力合作的方式提供整个文件系统的服务。将固定于某个地点的某个文件系统,扩展到任意多个地点/多个文件系统,这些节点组成一个文件系统网络。每个节点可以分布在不同的地点,通过网络进行节点间的通信和数据传输。人们在使用分布式文件系统时,无须关心数据是存储在哪个节点上,或者是从哪个节点获取的,只需要像使用本地文件系统一样管理和存储文件系统中的数据即可。

分布式文件系统中,重要的服务器包括:主控服务器(Master/NameNode)、数据服务器(一般称为ChunkServer或DataNode)和客户服务器(Client)。分布式文件系统的典型架构如图1所示。

图1典型分布式文件系统的结构

(1)分布式文件系统的特点

与传统文件系统相比,分布式文件系统具有以下主要特点。

①可扩展性强。扩展能力是一个分布式文件系统最重要的特点。基本上,所有的分布式文件系统都支持随时随地对数据服务器进行扩展,提升存储容量和访问带宽等。有的系统还支持多个目录/主控服务器。

②统一命名空间。采用统一命名空间,分布式文件系统对于客户端是完全透明的,客户端看到的是统一的全局命名空间,用户操作起来就像是管理本地文件系统。通过元数据管理,文件以块的方式采用多副本模式进行存放。

③高性能。由于一个文件被分成多份,保存在不同的数据服务器上,访问时,可以同时读取,性能会达到最优。

④高可用性。分布式文件系统必须具有高容错能力,即无论是客户端还是服务器出现故障,都不会影响整个系统的功能。为了做到这一点,单点失效是必须被避免的,例如使用资源冗余技术或者提供失效恢复服务。单个数据节点的故障并不会影响集群整体运转。

⑤弹性存储。可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行。弹性存储的最大挑战,是减小或增加资源时的数据震荡问题。

(2)常见的分布式文件系统

分布式文件系统既有开源软件平台解决方案,如HadoopHDFS、FastDFS等;也有非开源平台解决方案,如最为著名的GoogleFS、也有像WindowsServer/平台上的DFS组件等。分布式文件系统在当前应用普遍,产品种类丰富。下面介绍几种典型的系统。

分布式文件系统在当前应用普遍,产品种类丰富。下面介绍几种典型的系统。

①Lustre。

Lustre最早是由HP、ClusterFileSystem联合美国能源部共同开发的Linux平台下的分布式集群文件系统,后期由于ClusterFileSystem公司被Sun收购,而Sun又被Oracle收购,因此,Lustre官方网站目前挂靠在Oracle公司。

Lustre主要面向超级计算机,拥有超强可扩展性与可靠性,能够支持上万个节点、PB级存储、GB/s的高速访问能力。

Lustre采用GPL许可协议,属于开放源代码的分布式集群文件系统,开发语言采用C/C++,使用平台为Linux;当前,除了Oracle公司外,有新成立的名为Whamcloud的公司专注于Lustre平台的开源研发。

②GoogleFS。

GoogleFS(GoogleFileSystem)是谷歌公司开发的一个分布式可扩展的文件系统,它主要用于大型、分布式、大数据量的互联网应用平台。

GoogleFS被设计运行在廉价普通的PC服务器上,提供多数据副本实现数据冗余,通过数据分块并行存取,满足互联网用户的海量数据存储需求。

GoogleFS最早是由Google工程师于年发表的一篇学术文章TheGoogleFileSystem而为世人所熟知的,GoogleFS提供了相似的访问接口,如read、write、create、delete、close等,使得开发者可以非常方便地使用。

GoogleFS运行于Linux平台上,开发语言是C/C++,本身并不开源,本期中所介绍的Hadoop平台,是在受到GoogleFS启发后,采用其理念重新用Java语言实现的一个开源平台。

③FastDFS。

FastDFS是一个类GoogleFS的开源分布式文件系统,它由C/C++语言开发,可运行于Linux、Unix、AIX平台。FastDFS提供专用文件存取访问方式,不支持POSIX接口方式,在系统中也不能使用mount方式挂接。FastDFS在架构上充分考虑了冗余备份、负载均衡、可扩展等问题,平台本身具有高可用、高性能等优点。FastDFS支持文件的高效存储、同步、上传、下载等,比较适合于互联网视频网站、文档分享网站、图片分享网站等应用。

1.2HDFS介绍

HDFS是Hadoop的核心子项目,是整个Hadoop平台数据存储与访问的基础,在此之上,承载其他如MapReduce、HBase等子项目的运转。

HDFS是类似于GoogleFS的开源分布式文件系统,被设计成适合运行在通用硬件上的分布式文件系统。它与现有的分布式文件系统有很多共同点。但同时,它与其他的分布式文件系统的区别也是很明显的。

HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。

HDFS是易于使用与管理的分布式文件系统,主要特点和设计目标如下。

(1)硬件故障是常态

整个HDFS系统可以由数百或数千个存储着文件数据片段的服务器组成。实际上,它里面有非常巨大的组成部分,每一个组成部分都很可能出现故障,这就意味着HDFS里总是有一些部件是失效的,因此故障的检测和自动快速恢复是HDFS一个很核心的设计目标。

(2)流式数据访问

HDFS被设计成适合批量处理的,而不是用户交互式的。POSIX的很多硬性需求对于HDFS应用都是非必需的,HDFS放宽了POSIX的要求,这样,可以实现以流的形式访问(StreamingAccess)文件系统中的数据。同时去掉POSIX一小部分关键语义,可以获得更好的数据吞吐率。

(3)简单的一致性模型

大部分HDFS程序对文件操作需要的是一次写、多次读取的操作模式。HDFS假定一个文件一旦创建、写入、关闭之后就不需要修改了。这简单化了数据一致的问题,并使高吞吐量的数据访问变得可能。

(4)名字节点(NameNode)和数据节点(DataNode)

HDFS是一个主从结构,一个HDFS集群包括一个名字节点(也叫名称节点),它是一个管理文件命名空间和调节客户端访问文件的主服务器,当然,还有一些数据节点,通常是一个节点一个机器,它来管理对应节点的存储。HDFS对外开放文件命名空间,并允许用户数据以文件形式存储。内部机制是将一个文件分割成一个或多个块,这些块被存储在一组数据节点中。名字节点用来操作文件命名空间的文件或目录操作,如打开、关闭、重命名等。它同时确定块与数据节点的映射。数据节点负责来自文件系统客户的读写请求。数据节点同时还要执行块的创建、删除,以及来自名字节点的块复制指令。

(5)大规模数据集

HDFS被设计为PB级以上存储能力,单个的存储文件可以是GB或者TB级。因此,HDFS的一个设计原则是支持成千上万大数据文件的存储,即将单个文件分成若干标准数据块,分布存储于多个节点上,当用户访问整个文件时,由这些节点集群向用户传输所拥有的数据块,由此可以获得极高的并行数据传输速率。

(6)可移植性

HDFS在设计之初,就考虑到了异构软硬件平台间的可移植性,能够适应于主流硬件平台。它基于跨操作系统平台的Java语言进行编写,这有助于HDFS平台的大规模应用推广。

名字节点是整个HDFS的核心。一个标准的HDFS集群应由名字节点、备用名字节点、数据节点组成,HDFS的基本结构如图2所示。

图2HDFS系统的基本结构

集群中,一台机器上只运行一个NameNode实例,而集群中其他机器分别运行一个DataNode实例。NameNode是一个中心服务器,负责管理文件系统的名字空间以及客户端对文件的访问,用户能够以文件的形式在上面进行名字空间操作,比如打开、关闭、重命名文件或目录,同时,NameNode还决定了数据块到数据节点的映射关系。NameNode也可以称为管理文件系统的元数据。集群中,每一个节点配置一个DataNode,每个DataNode负责管理它所在节点上的数据存储。从内部看,一个文件被分成一个或多个数据块,这些块存储在一组DataNode上。同时,DataNode负责处理文件系统客户端的读写请求,在NameNode的统一调度下进行数据块的创建、删除和复制。

HDFS的数据块:磁盘存储文件时,是按照数据块(block)来存储的,也就是说,数据块是磁盘读/写的最小单位。数据块也称磁盘块。在HDFS中也有块的概念,默认为64MB,每个块作为独立的存储单元。

基于数据块的存储方式非常适合用于备份,可提供数据容错能力和可用性(如图3所示)。HDFS提供给应用程序例如MapReduce数据服务。一般来说,MapReduce的Map任务通常一次处理一个块中的数据,如果任务数太少(少于集群中节点的数量),就没有发挥多节点的优势,甚至作业的运行速度就会与单节点一样。

图3HDFS块副本

2.HDFS的运行机制

本期将详细介绍HDFS的结构与运行原理。

2.1HDFS的结构与组成

HDFS采用主/从(Master/Slave)结构,整个集群由一个名字节点和多个数据节点组成。

NameNode主要负责管理文件命名空间和客户端访问的主服务器,而DataNode则负责对存储进行管理。

HDFS的体系结构如图4所示。

图4HDFS的体系结构

由图4可知,名字节点NameNode上保存着控制数据节点DataNode信息的元数据(Metadata)。客户端Client可以通过NameNode对元数据进行操作,也可以直接对DataNode进行读和写操作。

2.1.1NameNode的主要功能

(1)管理元数据信息。元数据信息包括名字空间、文件到文件块的映射、文件块到数据节点的映射三部分。管理文件块包括创建新文件块、文件复制、移除无效文件块以及回收孤立文件块等内容。

(2)管理文件系统的命名空间。任何对文件系统元数据产生修改的操作,NameNode都会使用事务日志记录(下称EditLog)来表示;同样地,修改文件的副本系数也将往EditLog中插入一条记录,NameNode将EditLog存储在本地操作系统的文件系统中。同时,文件系统的命名空间被存储在一个称为映像文件(FsImage)的文件中,包括文件的属性、文件块到文件的映射以及文件块到数据节点的映射等内容,FsImage文件也是存放在NameNode所在的本地文件系统中。

(3)监听请求。指监听客户端事件和DataNode事件。客户端事件包含名字空间的创建和删除,文件的创建、读写、重命名和删除,文件列表信息获取等信息。DataNode事件主要包括文件块信息、心跳响应、出错信息等。处理请求指处理上面的监听请求事件并返回结果。

(4)心跳检测。DataNode会定期将自己的负载情况通过心跳信息向NameNode汇报。NameNode全权管理数据块的复制,它周期性地从集群中的每个DataNode接收心跳信号和块状态报告(BlockReport)。接收到心跳信号意味着该DataNode节点工作正常。块状态报告包含了一个该DataNode上所有数据块的列表。

NameNode决定是否将文件映射到DataNode的复制块上。

对于最常见的三个复制块,第一个复制块存储在同一机架的不同节点上,最后一个复制块存储在不同机架的某个节点上。

实际的I/O事务并没有经过NameNode,只有表示DataNode和块的文件映射的元数据经过NameNode。当外部客户机发送请求,要求创建文件时,NameNode会以块标识和该块的第一个副本的DataNodeIP地址作为响应。这个NameNode还会通知其他将要接收该块的副本的DataNode。

NameNode在FsImage文件中存储所有关于文件系统名称空间的信息,包含所有事务的记录文件EditLog存储在NameNode的本地文件系统上。FsImage和EditLog文件也需要复制副本,以防文件损坏或NameNode系统丢失。

2.1.2DataNode的主要功能

(1)数据块的读写。一般是文件系统客户端需要请求对指定的DataNode进行读写操作,DataNode通过DataNode的服务进程与文件系统客户端打交道。同时,DataNode进程与NameNode统一结合,对是否需要对文件块的创建、删除、复制等操作进行指挥与调度,当与NameNode交互过程中收到了可以执行文件块的创建、删除或复制操作的命令后,才开始让文件系统客户端执行指定的操作。具体文件的操作并不是DataNode来实际完成的,而是经过DataNode许可后,由文件系统客户端进程来执行实际操作。

(2)向NameNode报告状态。每个DataNode节点会周期性地向NameNode发送心跳信号和文件块状态报告,以便NameNode获取到工作集群中DataNode节点状态的全局视图,从而掌握它们的状态。如果存在DataNode节点失效的情况,NameNode会调度其他DataNode执行失效节点上文件块的复制处理,保证文件块的副本数达到规定数量。

(3)执行数据的流水线复制。当文件系统客户端从NameNode服务器进程中获取到要进行复制的数据块列表(列表中包含指定副本的存放位置,亦即某个DataNode节点)后,会首先将客户端缓存的文件块复制到第一个DataNode节点上,此时,并非整个块都复制到第一个DataNode完成以后才复制到第二个DataNode节点上,而是由第一个DataNode向第二个DataNode节点复制,如此反复进行下去,直到完成文件块及其块副本的流水线复制。

2.2HDFS的数据操作

HDFS被设计成在一个大集群中可以跨机器地可靠地存储海量的文件。它将每个文件存储成block(即数据块)序列,除了最后一个block,其他所有的block都是同样的大小。

2.2.1数据写入

在HDFS文件系统上创建并写一个文件的流程如图5所示。

图5HDFS写入流程

具体流程描述如下。

(1)Client调用DistributedFileSystem对象的create方法,创建一个文件输出流(FSDataOutputStream)对象。

(2)通过DistributedFileSystem对象与Hadoop集群的NameNode进行一次远程调用(RPC),在HDFS的Namespace中创建一个文件条目(Entry),该条目没有任何的数据块。

(3)通过FSDataOutputStream对象,向DataNode写入数据,数据首先被写入FSDataOutputStream对象内部的Buffer中,然后数据被分割成一个个Packet数据包。

(4)以Packet为最小单位,基于Socket连接发送到按特定算法选择的HDFS集群中的一组DataNode(正常是3个,可能大于等于1)中的一个节点上,在这组DataNode组成的Pipeline上依次传输Packet。

(5)这组DataNode组成的Pipeline反方向上发送ack确认,最终由Pipeline中第一个DataNode节点将Pipelineack发送给Client。

(6)完成向文件写入数据,Client在文件输出流(FSDataOutputStream)对象上调用close方法,关闭流。

(7)调用DistributedFileSystem对象的

1
查看完整版本: HDFS文件系统