【Hadoop03】:HDFS基础

前言

HDFS的全称是Hadoop Distributed File System,翻译过来就是Hadoop分布式文件系统,是hadoop的核心组件之一,提供了分布式存储服务。HDFS的解决了大数据领域的数据存储问题。通过HDFS,可以将数据存储在集群中的各个节点上,当存储规模达到一定程度时,只需要增加节点,就可以实现扩容。对于客户端而言,访问HDFS就像是访问普通的文件系统一样,不需要关心背后的实现。

HDFS基本概念

HDFS设计

HDFS以流式数据访问模式来存储超大文件,运行于商用硬件集群上。

  • 超大文件,这里指具有几百MB、几百GB甚至几百TB大小的文件。
  • 流式数据访问,HDFS的构建思路是这样的:一次写入、多次读取是最高效的访问模式。数据集通常由数据源生成或从数据源复制而来,接着长时间在此数据集上进行各种分析。每次分析都将涉及该数据集的大部分数据甚至全部,因此读取整个数据集的时间延迟比读取第一条记录的时间延迟更重要。
  • 商用硬件,Hadoop不需要运行在昂贵的高可靠硬件上。它是设计运行在商用硬件(很好买到的普通硬件)的集群上的,因此至少对于庞大的集群来说,节点故障的几率还是非常高的。HDFS遇到上述故障时,被设计成能够继续运行且不让用户察觉到明显的中断。
  • 低时间延迟的数据访问,要求低时间延迟数据访问的应用,例如几十毫秒范围,不适合在HDFS上运行。记住,HDFS是为高数据吞吐量应用优化的,这可能会提高时间延迟为代价。目前,对于低延迟的访问需求,HBase是更好的选择。
  • 大量的小文件,由于NameNode将文件系统的元数据存储在内存中,因此该文件系统所能存储的文件总数受限于NameNode的内存容量。根据经验,每个文件、目录和数据块的存储信息大约占150字节。因此,举例来说,如果有一百万个文件,且每个文件占一个数据块,那么至少需要300MB的内存。
  • 多用户写入,任意修改文件,HDFS中的文件写入只支持单个写入者,而且写操作总是以追加的方式在文件末尾写数据。它不支持多个写入者操作,也不支持在文件的任意位置进行修改。

NameNode与DataNode

HDFS采用Master/Slave架构,一个HDFS集群由一个NameNode和一系列的DataNode组成。NameNode节点负责集群的元数据管理,DataNode节点负责具体的数据存储。我们也可以认为NameNode是管理节点,DataNode是工作节点。

数据分块与副本

假设我们需要将1GB大小的文件在HDFS中存储,那么HDFS是将该文件直接存放在台DataNode节点吗?显然不是。

HDFS有数据块(block)的概念,默认为128MB。因此,将1GB大小的文件存储到HDSF,会被划分为8个数据块,分散存储到不同的DataNode节点。

为什么要使用分块存储存储呢?一个最明显的好处是,文件的大小可以超过任意一个DataNode节点的磁盘存储容量,因为文件会被拆分为数据块,在多个节点进行存储。第二个好处是,使用抽象的数据块作为存储单元,可以简化系统的设计,数据块和元数据可以分开进行管理。最后,数据块还非常适合进行数据备份,提高数据容错能力和可用性。将数据块复制到相互独立的机器上,可以确保在数据块、磁盘或机器发生故障后数据不会丢失。如果发现一个块不可用,系统会去其他地方读取备份块(也叫做副本),这个过程对于用户是透明的。

注意,上图只是为了便于理解,实际上DataNode并不知道自己存储的数据块属于哪个文件。

命名空间

HDFS支持传统的分层文件组织。用户或应用程序可以在这些目录中创建目录并存储文件。文件系统命名空间层次结构与大多数其他现有文件系统类似。可以创建和删除文件,将文件从一个目录移动到另一个目录,或重命名文件,但不支持硬链接或软链接。此外,HDFS支持用户配额和访问权限。

NameNode维护文件系统命名空间。NameNode记录对文件系统命名空间或其属性的任何更改。应用程序可以指定应由HDFS维护的文件的副本数,文件的副本数称为该文件的复制因子,该信息由NameNode存储。

客户端可以根据文件的层次,以路径的形式访问文件。例如hdfs://namenode:port/dir1/dir2/myfile,在大多数情况下,我们可以省略前缀,直接以路径的形式就可以了,如/dir1/dir2/myfile

小结

本章介绍了HDFS的基本概念。一个HDFS集群由一个NameNode和多个DataNode节点构成。NameNode负责集群元数据管理,DataNode节点负责具体的数据存储。HDFS上的数据是按照分块存储的,文件被切分成数据块存放在DataNode节点。NameNode在内存中维护目录树,客户端以路径的形式访问文件。

如果您觉得不错,请赞赏一下!