大数据与Hadoop系列之分布式文件系统(一)

文件系统

早在 1965 年开发的 Multies ( UNIX 的前身)就详细地设计了文件系统,这使得文件系统成为多用户单节点操作系统的重要组成部分。最初的文件系统用于解决信.息的长期存储,并达到如下要求:

1.能够存储大量的信息。

2.使用信息的应用终止时,信息必须保存下来。

3.多个应用可以并发地存储信息。

解决这些问题的通常方法,是把信息以一种单元,即"文件" ( file)的形式存储在磁盘或者其他外部介质上,一个文件是一个命名的、存储在设备上的信.息的线性字节流。文件在需要的时候可以读取这些信息或者写入新的信息。存储在文件中的信息必须是永久的,也就是说,它不会因为应用的创建/终止受到影响。只有当用户显式地剧除它时,文件才会消失。对文件的管理,包括了文件的结构以及命名、存取、使用、保护和实现,称为文件系统。

从用户的观点来看,文件系统中最重要的方面是文件系统如何呈现在他们面前。即一个文件由什么组成、文件如何命名、如何保护文件,以及对文件可以进行哪些操作等。而对文件系统的设计者来说,他们还需要关注如何记录文件的相关信息。如何组织存储区等问题。

文件系统的用户界面

下面详细讨论文件系统的用户界面,也就是从用户的角度来研究文件,即文件是怎么使用的、有些 什么特征。

文件作为一种抽象机制,最重要的特征就是命名方法。各种系统的文件命名规则略有不同,但一般都支持由一定长度字符串作为文件名。应用创建文件的时候要指定文件名,文件在应用结束后仍然存在,其他应用可以使用该文件名对它进行操作。大部分的文件系统不关心文件里保存的数据,把文件内容作为无结构的字节序列保存。也有一些文件系统支持结构化文件,以记录为单位组织信息,免去文件系统使用者将“原始的”字节流转换成记录流的 麻烦。除了文件名和数锯,文件系统会嗽予文件其他的信息,比如文件的创建日期、文件长度、创建信息、引用计数等。我们把这些额外的项称为文件属性,有时也称为元数据。

1常用文件操作

大部分文件系统支持的与文件相关的常用系统调用如下:

1.创建文件:创建没有任何数据的文件,该调用的目的是声明文件存在,并且设置一些属性。

2.删除文件:当不再需要文件时,必须剧除它以释放存储空间。

3.打开文件:在使用文件之前要先打开文件,打开文件后,文件系统会在内存中保留和打开文件相关的一些 信息,有时还会创建对文件存取的相关机制。

4.关闭文件:当存取结束后,通过关闭文件,可以把在内存中保留的一些信息写回文件系统,井释放打开文件需要占用的资源。

5.读文件:从文件中读取数据,一般来说,该操作从当前位置的文件中将数据读取到一个缓冲区中。

6.写文件:往文件中写入数据。

7.追加数据:该方法是写文件的限制形式,它只能在文件未尾添加数据。

8.读记录:在结构化文件中读取记录。

9.写记录:在结构化文件中写入记录。

10.删除记录:在结构化文件中侧除记录。

11.移动当前位置:当需要指定从哪里读写数据的时候,使用该调用可以把当前位置移动到文件中的特定位置。

12.获取文件属性:读取文件的某个属性,如文件的最后修改时间。

13.设置文件属性:有些属性是用户可以修改的,在文件创建之后,能够修改它们,设置文件属性就是用于这个目的。

14.文件改名:用户改变现有文件的文件名。

2 .目录与目录树

目录是文件系统中另一个重要的概念。一个“目录”或“文件夹”就是一个虚拟容器,它里面保存着一组文件和其他一些目录。一个典型的文件系统可能会包含成千上万的目录,多个文件通过存储在一个目录中,可以达到有组织地存储文件的目的。同时,在一个目录中可以保持另外的目录(称为子目录),这些目录和文件构成了一个层次结构(即目录树),如图 所示。使用目录树组织文件系统时,需要通过某种方法指明文件名。路径名描述了怎样在一个文件系统中确认一个文件的位置,它是一个分量名序列,各分量名之间用分隔符(在 Linux中,分隔符是斜杠符)隔开。分量 名是一个字符序列,它指明一个披唯一地包含在前缀(父目录)分处中的名字。一个完整的路径名由一个分隔符(为了方便讨论,后面采用斜杠符“ / ”作为分隔符)开始,并且指明一个文件,这个文件可以从文件系统的根(没有祖先的目录)开始,沿着该路径名的后继分量名所在的那个分支游历文件树而找到。因此,路径名“ / etc / passwd ”和“ /usr / src / cmd / datc.c ”都是图 树中文件。

大数据与Hadoop系列之分布式文件系统(一)

以上提到的两个路径名都是从根目录开始,由根目录到文件的路径组成,这样的路径是绝对路径。相对路径是另外一种指明文件的方法,需要和工作目录(也称当前目录)一起使用。用户可以指定一个目录作为当前的工作目录。这时,所有的路径名如果不是从根目录开始,都是相对于工作目录的。例如,当前工作目录是“ /usr / aIice " ,那么绝对路径为“ / usr/alice/mailbox ”的文件,可以简单地用“ mailbox ”引用。

文件系统中用于管理目录的系统调用差别比较大,下面是 UNIX 系统的例子:

1.创建目录:创建目录,新创建的目录会包含两个特殊的目录项,其中“ . ”指当前目录,“..”指向父目录。

2.删除目录:删除目录。

3.打开目录:目录内容可以被读取。例如,为了列出目录中的所有文件/目录,程序必须先打开该目录,让后读取其中所有文件/ 目录项。

4.关闭目录:读目录结束以后,应该关闭被打开的目录。

5.读目录:返回打开目录的下一个目录项。日目录改名:在很多方面,目录和文件相似。文件可以换名,目录也一样。

3 .存储媒体上的文件系统

现代计算机系统常常配置有多个存储设备,并且大容量 磁盘常常被分成逻辑上不同的存储设备,文件管理器可以实现存储在不同设备上的目录层次,并将这些不同的层次组合成单个系统层次,如软盘,CD-ROM等可移动媒体上的信息就被组织成单根的树,通过根就可以遍历这个层次结构。上述存储媒体上的具有单个根目录的文件层次集合也称为文件系统,文件系统是一个非常有用的管理单元.注意,这里的“文件系统”和下面要讨论的Hadoop文件系统,意义不相同,请区分。

UNIX系统中提供的文件系统操作包括:

1.加载文件系统:将一个文件系统添加到一个已经存在的目录中,被安装的文件系统的根取代基文件系统的目录。

2.卸载文件系统:将某一个已经加栽的文件系统卸载。

加载文件系统操作,就是将某个文件系统“嫁接”到另一个文件系统的目录层次中。

例如,有两个不同的文件系统,分別是文件系统1和文件系统2,它们是存储在不同介质上(如两个不同的磁盘〉的单根目录树。将文件系统2加栽到文件系统1的“/home”目录下,就可以通过“/home/user1”访问文件系统2原有目录结构下“/user1”的目录内容了。

大数据与Hadoop系列之分布式文件系统(一)

文件系统的实现

现在,让我们从用户角度转到实现者角度来研究文件系统。用户关心的是文件是如何命名的,可以进行哪些操作,目录树是什么样的以及类似的问题。而实现者感兴趣的是文件和目录是如何存储的,存储空间是怎样管理的和系统是如何有效而可靠地工作。

1.块管理

文件的物理结构指文件在存储设备(如磁带、磁盘、光盘)上的存取方式。为了便于管

理,设备往往将存储空间组织成为具有一定结构的存储单位。

以磁盘为例,磁盘在逻辑上会划分为磁道、柱面和扇区,扇区是磁盘的读写单位,也是磁盘读写时候的最小寻址单位,一个扇区一般是512字节(自2009年底开始,磁盘制造商开始引入使用4096字节扇区的磁盘)。讨论文件的物理结构时,需要考虑存储设备的存储结构。

块管理用于记录存储块和文件的关联关系,对于随机存储设备(如磁盘)而言,一般有如下三种方法来实现块管理.

(1)连续分配

最简单的物理结构是连续分配,连续分配将文件中的N个逻辑块映射到N个地址连续的物理块上。以磁盘为例,如果扇区的大小是512字节,50KB的文件需要分配连续的100个扇区。这种方案简单、性能好,允许驱动器花较少的时间对整个文件进行读取和写入,

不足之处也很明显,首先很难預先知进文件的大小,文件系统也就无法确定要保留多少存储空间:其次,这种分配方案很容易产生存储空间碎片,原本可以使用的存储空间被浪费了,同时,只要文件系统打算给一个文件分配W块,则存储设备中必须找到N个连续的物理块。

(2)链接表

存储文件的第二种方式是为每一个文件构造存储空间的链接表,在每个存储单元的特定部位,保存下一个存储单元的位置,毎个逻辑块都包含一个带连接的头,用来指向下一个逻辑块对应的物理块的地址。和连续分配方案不同,这种方法能利用系统的毎一个磁盘块,同时,目录项中只需要保存第一个存储单元的地址,文件的其他块可以根据这个地址来査找。

链接分配方案顺序读取文件非常方便,但是随机存储效串比较低。如果应用需要读取文件块3中的内容,它必须依次读取前面的3个文件块,才能定位到文件块3,如图所示.

大数据与Hadoop系列之分布式文件系统(一)

(3)索引链式表

为了克服链接表分配的不足,取出每个磁盘块的指针字段,把它放到一张索引表中,就形成了使用索引链式表分配。如图所示,表的序号为物理块号,毎个表项存放链接指针,指向属于同一文件的下一物理块,文件的第一块地址存放在目录项中,计算机引导以后,这张表会保持在内存中,不需要访问磁盘。该方法的缺点是需要把整个链表存放在内存中。 MS-DOS采用的就是这种文件物理结构。

大数据与Hadoop系列之分布式文件系统(一)

2.目录管理

目录作为文件和子目录的容器。其数据由一组结构化的记录组成,每个记录描述了集合中的一个文件或者子目录。记录提供足够的信息,允许文件管理器确定文件的所有已知特征,例如,名字、长度、建立时间、最后访问时间、所有者等。目录的实现,通常是在存储设备中。将目录作为特殊文件(往往是结构化文件,支持基于记录的操作)保存,或保存在

某一个特定的存储区域中。以MS-DOS目录项为例,它的目录項有32字节,如下图

大数据与Hadoop系列之分布式文件系统(一)

目录项中包含了文件名、扩展名等厲性,特别需要注意的是,通过第一块块号,以及前面介绍的索引链式表,可以找到文件的所有块。

3.存储媒体上的文件系统管理

计算机启动的时候,需要标识系统引导盘,获得主引导记录,在某些系统上(如Linux),还需要定义包含根目录的逻辑设备。同时,当可移动媒体被连接到相应的存储设备时,它的文件系统被“安装” 到某一个目录层次中。这些操作都是针对存储煤体上的文件系统的操作,涉及了文件系统的物理结构。

存储煤体上的文件系统的物理结构和目录类似,是保存在某一位置的一个结构化记录。以CD-ROM使用的ISO 9660文件系统为例,该文件系统存放在卷(volume)中,其信息保存在一个2048字节的块中,包含了如文件系统魔数、版本号、系统标识等信息,文件管理器通过这些信息,使用文件管理器的ISO 9660处理子系统,躭可以访问CD-ROM上的文件、目录。

4.存储空间管理

在传统文件系统的物理实现中,最后一个重要问題是存储空间管理,也躭是对存储介质上未使用空间的管理,当创建文件、写入文件或删除文件时,都涉及存储空间的管理。目前,存储空间管理主要的方法有空闲文件目录、空闲块链、位示图等•以空闲块链为例,当文件系统采用链式表进行块管理时,可以将空闲的块组成空闲块链,保存在一个特殊的文件中。

由于在Hadoop具体文件系统的实现,特別是HDFS的实现中存储空间管理的特殊性,就不再对这个问題进行深入讨论了。

5.1.3文件系统的保护控制

文件系统解决了信息的长期存储和多个应用存储、访问信息的问题,但也带来了文件的共享、保护和保密三个不同而又相互联系的问理。

文件的共享是指不同的用户共同使用一个文件:文件的保护指文件本身需要防止文件的拥有者或其他用户破坏文件内容:文件保密指未经用户拥有者允许,任何用户不得访问该文件。这三个问题实际上是一个用户对文件的使用权限,即读、写、执行的许可权问埋•

每次访问被保护资源时,系统通过存储控制验证模块做出相应的决定,这个过程一般包括

如下3步:

1)审定用户的存取权限;

2)比较用户扠限和本次存取要求是否一致:

3)将存取要求和被访问文件的保密性比较,看是否有冲突。

用于验证用户存取操作一般有4个方式:口令、密码、存取控制矩阵、存取控制表和权限表。

1.口令

用户创建文件时,可以为文件提供口令,并记录在文件说明信息中.当任意一个用户想使用该文件时,都必须首先提供口令,只有用户提供的口令和文件说明信息中的口令一致的时候,才允许存取。显然,口令只有设置者自己知进,若允许其他用户使用自己的文件,口令设置者可以将口令賦予其他用户。

通过这样的方法,可以简单地实现文件的共享和保密,而且口令较为简单,占用的内存单元以及验证口令所费时间都将非常少。不过,相对来说,口令方式保密性较差,口令一旦被人掌握,就可以获得和文件拥有者同样的权利而没有任何等级差别。同时,修改文件的口令,也需要通知所有授权用户。

2.密码

防止文件泄密以及控制存取访问的另一种方法是密码.密码方式是指在用户创建源文件、写入存储设备前,通过特定的算法和加***对文件内容进行编码加密,读取文件时,必须提供相应的解***,进行解密。只有用户给定的**和加密时的**一致,才能读取被加密的文件。

和口令不同,加密方式具有保密性强的优点,同时**不需要保存在文件系统中,而是由用户自己掌握。但是,由于编码解码工作需要耗费大量的处理时间,因此,加密技术是以牺牲系统开销为代价的。口令方式中有时也采用一定的加密技术,加密口令方式可以对口令本身进行加密,加密后的口令仍然存放在文件说明信息中,但加密口令方式不对文件内容进行加密,保密性弱。

3.存取控制矩阵

存取控制矩阵以二维矩阵的方式进行存储控制,其中一维是所有用户,另一维是所有文件,矩阵的每一个元索都表示该元素对应的用户对文件的扠限,如表所示•其中,读、

写、执行分别表示为R、W和X。

大数据与Hadoop系列之分布式文件系统(一)

存储控制验证模块在处理用户的存取需求时,通过査找矩阵中该用户和该文件所对应元素的值,当该元素表明有访问许可的时候,才能进行具体的访问。如第1行,Alice的权限为RWX,表明Alice可以对文件“/bin/datetime”进行读、写和执行操作:用户Bin只拥有权限X,所以Bin只能执行文件“/bin/datetimc”,不能进行其他操作。

存取控制矩阵是一种很自然的方法,可以对系统中所有文件的存取权限进行完整有效的控制。但是当系统中用户和文件数较多时,存储和管理这样的矩阵需要比较大的系统开销,用户访问一个文件,都需要对矩阵的一行进行搜索,访问效串很低。

4.存取控制表和权限表

实际上我们很少存储像上面那样的矩阵,这个矩阵非常大,并且有很多空项,大多数

用户只存取很少的文件,因此,可以使用两种方法:按行或按列来存储矩阵,而且只存取非空元索.

第一种存储技术按行来保存,每一个文件被賦予一张排序的表,其中列出可以访问该文件的用户,以及如何进行访问,这种类型表称为存取控制表,下图给出了上图对应的存取控制表。

大数据与Hadoop系列之分布式文件系统(一)

权限表中每个访问控制表(Access Control List, ACL)都指定了用户对文件允许的访问(读、写、执行>。如文件“/bin/showdata”,Alice具有读、写权限,而Tom只能执行该文件,其他用户都不能访问该文件• UNIX/Linux系统采用类似的方案,后面会讨论UNIX/

Linux的保护控制机制。

如果按照列来保存存取控制矩阵,为毎一个用户保存一张可以访问的文件表及其操作,就形成了权限表,其中毎一项叫权限,用户Bin的权限表如表所示。

大数据与Hadoop系列之分布式文件系统(一)

上表中,权限域给出了对象(文件)允许执行的合法操作,通过对象域的指针,指向被保护的对象。由表可知,用户Bin可以执行文件“/bin/datetime”,可以对文件“/home/bin/README”进行读写。

未完待续............