HDFS产生背景
随着日常生活和工作中数据量越来越大,文件和数据被越来越多地存储到系统管理的磁盘中,单台机器已经不能满足大量的文件存储需求,当数据集的大小超过一台独立物理计算机的存储能力时,就有必要对它进行分区(parttion)并存储到若干台单独的计算机上,因此需要一种允许多机器上的多用户通过网络分享文件和存储空间的文件管理系统,这就是分布式文件系统。分布式文件系统有很多,下面将详细地介绍HDFS。
2HDFS的设计
HDFS的设计主要是为了实现存储大量数据、成本低廉、容错率高、数据一致性和顺序访问数据这四个目标。
大数据集:HDFS适合存储大量文件,总存储量可以达到PB/EB级别,单个文件一般在几百兆。
成本低廉:Hadoop并不需要运行在昂贵且高可靠的硬件上,其设计运行在商用廉价硬件的集群上,因此对于庞大的集群来说,节点发生故障的几率还是非常高的。HDFS遇到上述故障时,能够继续运行且可以不让用户察觉到明显的中断。
流式数据访问(一致性模型):HDFS的构建思路是这样的:一次写入,多次读取是最高效的访问模式,数据集通常由数据源生成或从数据源复制而来,接着长时间在此数据集上进行各种分析。每次分析都将设计到数据集上的大部分甚至全部数据,因此读取整个数据集的时间延迟比读取第一条记录的时间延迟更重要。
顺序访问数据:HDFS适用于处理批量数据,而不适合随机定位访问。
HDFS的概念及体系结构
数据块(block):每个磁盘都有默认的数据块大小,这是磁盘进行数据读/写的最小单位,HDFS同样也有块(block)的概念,在HDFS1.x版本,默认的数据块大小是64M,在HDFS2.x版本中默认的数据块大小为128M。与单一磁盘上的文件系统一致,HDFS上的文件也被划分为块大小的多个分块,作为独立的存储单元,但与其他文件系统不同的是,HDFS中小于块大小的文件不会占据整个块的空间(例如大小为1MB的文件存储在一个大小为128M的块中时,文件只会占用1MB的磁盘空间,而不是128M)。文件系统块一般为几千字节,磁盘块一般为512字节,为何HDFS中的块如此之大?HDFS的块比磁盘块大,其目的时为了最小化寻址开销。如果设置的足够大,从磁盘传输数据的时间可以明显大于定位这个块开始位置所需的时间,这样传输一个由多个块组成的文件的时间明显取决于磁盘传输速率。但该参数也不可以设置的过大,MapReduce中的map任务通常一次处理一个块的数据,因此如果任务数太少(少于集群中的节点数量)作业的运行速度就会很慢。我们来做一个运算,如果寻址时间为10ms左右,磁盘的传输速率为100M/s,为了使寻址时间占传输时间的1%,我们需要将块的大小设计为100M左右。
NameNode(管理者):NameNode为HDFS集群的管理节点,一个集群通常只有一台活动的NameNode,它主要存放了HDFS的元数据,元数据是指每个文件中各个块所在的数据节点信息,但它并不永久保存块的位置信息