HDFS详解
1.HDFS的设计
1.1.HDFS使用场景
超大文件----在这里指具有几百MB几百GB甚至几百TB大小的文件。目前已经存储PB级数据的hadoop集群了;
流式数据访问----一次写入、多次读取是高效的访问模式。数据集通常由数据源生成或从数据源复制而来,接着长时间在此数据集上进行各类分析。每次分析都会涉及该数据集的大部分数据甚至全部,因此读取整个数据集的时间延迟比读取第一条记录的时间延迟更重要;
商用硬件----hadoop并不需要运行在昂贵且高可用的硬件上。他是设计运行在商用硬件的集群上的,因此至少对于庞大的集群来说,节点故障的几率还是非常高的。HDFS遇到上述故障时,被设计成能够继续运行且不让用户察觉到的中断。
1.2.HDFS不适用的场景
低时间延迟的数据访问----要求低时间延迟的访问的应用,不适合在HDFS上运行。记住,HDFS是为高数据吞吐量应用优化的,这可能会以高时间延迟为代价。目前,对于低延迟的访问需求,hbase是更好的选择。
大量的小文件----由于nameNode将文件系统的元数据存储在内存中,因此该文件系统所能存储的文件总量受限于nameNode的内存总容量。根据经验,每个文件、目录和数据块的存储信息大约占150字节。过多的小文件存储会大量消耗nameNode的存储量。
多用户写入,任意修改文件----HDFS中的文件只有一个Writer,而且写操作总是将数据添加在文件的末尾。他不支持具有多个写入者的操作,也不支持在文件的任意位置进行修改。
2.HDFS的概念
2.1.数据块
每个磁盘都有默认的数据块大小,这是磁盘进行数据读/写的最小单位,构建于单个磁盘之上的文件系统通过磁盘块来管理该文件系统中的块,该文件系统块的大小可以是磁盘块的整数倍。HDFS同样也有块的概念,但是大得多,默认为64MB。与单一磁盘上的文件系统相似,HDFS上的文件也被划分为多个分块,作为独立的存储单元。与其他文件系统不同的是,HDFS中小于一个块大小的文件不会占据整个块的空间。
对分布式文件系统中的块进行抽象会带来很多好处:
第一个明显的好处是,一个文件的大小可以大于网络中任意一个磁盘的容量。文件的所有块并不需要存储在同一个磁盘上,因此他们可以利用集群上的任意一个磁盘进行存储。
第二个好处是,使用块抽象而非整个文件做为存储单元,大大简化了存储子系统的设计。简化是所有系统的目标,但是这对于故障种类繁多的分布式系统来说尤为重要。将存储子系统控制单元设置为块,可简化存储管理(由于块的大小是固定的,因此计算单个磁盘能够存储多少个块相对容易)。同时也消除了对元数据的顾虑(块只是存储数据的一部分---而文件的元数据,如权限信息,并不需要与块一同存储,这样一来,其他的系统就可以单独管理这些元数据)。
块非常适合用于数据备份进而提供数据容错能力和可用性。将每个块复制到少数几个独立的机器上(默认为3个),可以确保在发生块、磁盘或机器故障后数据不会丢失。如果发现一个块不可用,系统会从其他地方读取另一个复本,而这个过程对用户是透明的。
3.HDFS构成
HDFS集群由三部分构成,并以管理者-工作者模式运行。这三部分分别是:一个nameNode(管理者)、一个secondNameNode(namenode辅助系统)和多个datanode(工作者)。并且用户通过客户端(client)与hdfs进行通讯交互。
3.1.namenode
nameNode管理文件系统的命名空间。他维护着文件系统树及整棵树内所有的文件和目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件(fsimage)和编辑日志文件(editlog)。nameNode也记录着每个文件中各个块所在的数据节点信息,但它并不会永久保存块的位置信息,因为这些信息会在系统重启时由数据节点重建。
3.2.SecondnameNode
文件系统客户端在执行写操作时,这些操作首先被记录到编辑日志中,然后更新nameNode内存中维护的文件系统的元数据;命名空间镜像文件(fsimage)是文件系统元数据的一个永久检查点,因为fsimage文件是一个大型文件,如果频繁的执行写操作,会使系统运行极为缓慢。但是如果不进行操作,editlog文件会无限增长,一旦nameNode需要恢复,则需要花费非常长的时间,所以hdfs引入了辅助nameNode,为主nameNode内存中的文件系统元数据创建检查点。最终,实现将主nameNode的编辑日志和命名空间镜像文件合并。形成一个更小的editlog文件和最新的fsimage文件。
3.3.Datanode
Datanode是文件系统的工作节点。他们根据需要存储并检索数据块(受客户端或namenode调度),并且定期向nameNode发送他们所存储的块的列表。
3.4.Client(客户端)
客户端代表用户通过与nameNode和datanode交互来访问整个文件系统。客户端提供了一个类似于POSIX(可移植操作系统界面)的文件系统接口,因此用户在编程时无需知道nameNode和datanode也可以实现其功能。
3.5.nameNode容错
如果没有nameNode,文件系统将无法使用。事实上,如果运行nameNode服务的机器损毁,文件系统上所有的文件都将会丢失,因为我们不知道如何根据datanode的块来重建文件。因此,对nameNode实现容错非常重要,hadoop为此提供了两种机制:
第一种机制是备份那些组成文件系统元数据持久状态的文件。Hadoop可以通过配置使nameNode在多个文件系统中保存元数据的持久状态。这些写操作是实时同步的,是原子操作。一般的配置是,将持久状态写入本地磁盘的同时,写入一个远程挂载的网络文件系统(NFS)
另一种可行的方式是运行一个辅助nameNode,但它不能被作为nameNode。这个辅助nameNode的重要作用是定期通过编辑日志合并命名空间镜像,以防止编辑日志过大。这个辅助nameNode一般在另外一台单独的物理计算机上运行,因为它需要占用大量cpu时间和与nameNode相同容量的内存来执行合并操作。他会保存合并后的命名空间镜像的副本,并在nameNode发生故障时启用。但是,辅助nameNode保存的状态总是滞后于主节点,所以在主节点全部失效时,难免会丢失部分数据。在这种情况下,一般把存储在NFS上的nameNode元数据复制到辅助nameNode并作为新的主nameNode运行。
3.6.HDFS中的文件访问权限
针对文件和目录,HDFS有与POSIX非常相似的权限模式。
一共提供三类权限模式:只读权限(r)、写入权限(w)和可执行权限(x)。读取文件或列出目录内容时需要只读权限。写入一个文件,或是在一个目录上创建及删除文件或目录,需要写入权限。对于文件而言,可执行权限可以忽略,因为你不能在HDFS中执行文件(与POSIX不同),但在访问一个目录的子项时需要该权限。
每个文件和目录都有所属用户(owner)、所属组别(group)及模式(mode)。这个模式是由所属用户的权限、组内成员的权限及其他用户的权限组成的。
默认情况下,可以通过正在运行进程的用户名和组名来唯一确定客户端的标示。但由于客户端是远程的,任何用户都可以简单的在远程系统上以他的名义创建一个账户来进行访问。因此,作为共享文件系统资源和防止数据意外损失的一种机制,权限只能供合作团体中的用户使用,而不能在一个不友好的环境中保护资源。注意,最新的hadoop系统支持kerberos用户认证,该认证去除了这些限制。但是,除了上述限制之外,为防止用户或者自动工具及程序意外修改或删除文件系统的重要部分,启用权限控制还是很重要的。
注意:这里有一个超级用户的概念,超级用户是nameNode进程的标识。对于超级用户,系统不会执行任何权限检查。
4.数据流
4.1.文件读取剖析