1、初识HDFS
HDFS作为一个分布式文件系统,具有高容错的特点,它可以部署在廉价的通用硬件上,提供高吞吐率的数据访问,适合那些需要处理海量数据集的应用程序。HDFS没有遵循可移植操作系统接口(Portable Operation SystemInterface,POSIX)的要求,不支持“ls”或“cp”这样的标准UNIX命令,也不支持如fopen()和fread()这样的文件读写方法,而是提供了一套特有的、基于Hadoop抽象文件系统的API,支持以流的形式访问文件系统中的数据。
A、HDFS的主要特性
HDFS的主要特性包括:
支持超大文件。超大文件在这里指的是几百MB、几百GB甚至几TB大小的文件,一般来说,一个Hadoop文件系统会存储T(1TB=1024GB)、P(1P=1024T)级别的数据。Hadoop需要能够支持这种级别的大文件;
检测和快速应对硬件故障。在大量通用硬件平台上构建集群时,故障,特别是硬件故障是常见的问题。一般的HDFS系统是由数百台甚至上千台存储着数据文件的服务器组成,这么多的服务器意味着高故障率。因此,故障检测和自动恢复是HDFS的一个设计目标;
流式数据访问。HDFS处理的数据规模都比较大,应用一次需要访问大量的数据。同时,这些应用一般是批量处理,而不是用户交互式处理。HDFS使应用程序能够以流的形式访问数据集,注重的是数据的吞吐量,而不是数据访问的速度;
简化的一致性模型。大部分的HDFS程序操作文件时需要一次写入,多次读取,在HDFS中,一个文件一旦经过创建、写入、关闭后,一般就不需要修改了。这样简单的一致性模型,有利于提供高吞吐量的数据访问模型。
正是由于以上的设计目标,HDFS并不适合如下应用:
低延迟数据访问。低延迟数据,如和用户进行交互的应用,需要数据在毫秒或秒的范围内得到响应。由于Hadoop针对高数据吞吐量做了优化,而牺牲了获取数据的延迟,对于低延迟访问,可以考虑使用HBase或Cassandra;
大量的小文件。HDFS支持超大文件,是通过将数据分布在数据节点(DataNode),并将文件的元数据保存在名称节点(NameNode)上。名称节点的内存大小,决定了HDFS文件系统可保存的文件数量,虽然现在的系统内存都比较大,但大量的小文件还是会影响名称节点的性能;
多用户写入文件、修改文件。HDFS中的文件只能有一个写入者,而且写操作总是在文件末尾。它不支持多个写入者,也不支持在数据写入后,在文件的任意位置进行修改。
总之,HDFS是为以流式数据访问模式存储超大文件而设计的文件系统,并在普通商用硬件集群上运行。
B、HDFS的体系结构
为了支持流式数据访问和存储超大文件,HDFS引入了一些比较特殊的设计,在一个全分布模式环境的集群上,“运行HDFS”意味着在网络分布的不同服务器上运行一些守护进程(daemon),这些进程有各自的特殊角色,并相互配合,一起形成一个分布式文件系统。
HDFS采用了主从(Master/Slave)式体系结构,名称节点NameNode、数据节点DataNode和客户端Client是HDFS中3个重要的角色。
在一个HDFS中,有一个名称节点和一个第二名称节点,典型的集群有几十到几百个数据节点,规模大的系统可达上千、甚至几千个数据节点;而客户端,一般情况下,比数据节点的个数还多。名称节点和第二名称节点、数据节点和客户端的关系如下图所示:
名称节点可以看作是分布式文件系统中的管理者,它负责管理文件系统命名空间、集群配置和数据块复制等。
数据节点是文件存储的基本单元,它以数据块的形式保存了HDFS中文件的内容和数据块的数据校验信息。
客户端和名称节点、数据节点通信,访问HDFS文件系统,操作文件。
2、数据块
在介绍上述各实体之前,首先了解一下HDFS中的重要概念:数据块(Block)。
在讨论文件系统的时候,特别是在分析文件系统的实现时,我们知道,为了便于管理,设备往往将存储空间组织成为具有一定结构的存储单位。如磁盘,文件是以块的形式存储在磁盘中,块的大小代表系统读/写操作的最小单位;在Linux的Ext3文件系统中,块大小默认为4096字节。文件系统通过一个块大小的整数倍的数据块,来使用磁盘。磁盘上的数据块管理属于文件系统实现的内部细节,对于通过系统调用读写文件的用户来说,是透明的。
HDFS也有块的概念,不过是更大的单元,默认HDFS数据块大小是64MB(1.x版本)/128MB(2.x版本)。和普通文件系统类似,HDFS上的文件也进行分块,块作为单独的存储单元,以Linux上普通文件的形式保存在数据节点的文件系统中。数据块是HDFS的文件存储处理的单元。
HDFS是针对大文件设计的分布式系统,使用数据块带来了很多的好处,具体如下:
- HDFS可以保存比存储节点单一磁盘大的文件。
文件块可以保存在不同的磁盘上。其实,在HDFS中,文件数据可以存放在集群上的任何一个磁盘上,不需要保存在同一个磁盘上,或同一个机器的不同磁盘上。
- 简化了存储子系统。
简单化是所有系统的追求,特别是在故障种类繁多的分布式系统中,将管理“块”和管理“文件”的功能区分开,简化了存储管理,也消除了分布式管理文件元数据的复杂性。
- 方便容错,有利于数据复制。
在HDFS中,为了应对损坏的块以及磁盘、机器故障,数据块会在不同的机器上进行复制(一般副本数为3,即一份数据保存在3个不同的地方),如果一个数据块副本丢失或者损坏了,系统会在其他地方读取副本,这个过程对用户来说是透明的,它实现了分布式系统中的位置透明性和故障透明性。同时,一个因损坏或机器故障而丢失的块会从其他地方复制到某一个正常运行的机器,以保证副本数目恢复到正常水平。该正常水平的副本数,也称副本系数。
HDFS数据块比前面讨论过的磁盘块大得多,一个典型的HDFS系统中,磁盘块的大小为64MB,也有使用128MB和256MB数据块大小的集群。为什么在HDFS中要使用这么大的数据块呢?原因和在磁盘上使用大磁盘块的原理是一样的。在普通文件系统中使用较大的磁盘块,可以减少管理数据块需要的开销,如在Linux中可以减少保存在i-node中磁盘地址表中的信息链的长度;同时,在对文件进行读写时,可以减少寻址开销,即磁盘定位数据块的次数。HDFS中使用大数据块,可以减少名称节点上管理文件和数据块关系的开销,同时,对数据块进行读