作者 | 大尊
hdfs是hadoop的分布式文件系统,即Hadoop Distributed Filesystem。下面主要讲下HDFS设计中的比较重要的点,使读者能通过简短的文章一窥HDFS的全貌,适合对HDFS有一点了解,但是对HDFS又感到困惑的初学者。本文主要参考的是hadoop 3.0的官方文档。
链接:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html
当数据集的大小超过了一台物理机所能存储的能力时,就需要将它进行分区并存储到若干不同的独立的计算机上,其中管理跨多台计算机存储的文件系统称为分布式文件系统。
目录
-
使用HDFS的场景
-
HDFS的工作模式
-
文件系统命名空间(namespace)
-
数据复制
-
文件系统元数据的持久化
-
通讯协议
-
健壮性
-
数据组织
-
可访问性
-
存储空间回收
1、使用HDFS的场景
HDFS适合于以流式数据访问模式来存储超大的文件。即一次写入,多次读取,在数据集上长时间进行各种分析,每次分析都涉及该数据集数据的大部分甚至全部,对于超大文件,hadoop目前以支持存储PB级数据。
HDFS并不适合要求低时间延迟数据访问的应用,因为HDFS是为高数据吞吐量应用而优化的,这就有可能以时间延迟大为代价。
HDFS文件系统所能存储的文件总数受限于namenode的内存容量,根据经验,100百万的文件,且每个文件占一个数据块,那至少需要300MB的内存。
目前hadoop文件可能只有一个writer,而且写操作总是将数据添加在文件末尾,不支持在文件的任意位置进行修改。
相对于普通文件系统的数据块,HDFS也有块的概念,默认是128MB,HDFS上的文件也被划分成块大小的多个分块,作为独立的存储单元,不过HDFS中小于一个块大小的文件不会占据整个块的空间。如果没有特别指出,文中提到的块特指HDFS的块。
为何HDFS的块如此之大,其目的是为了最小化寻址开销。这个数也不能设置的过大,mapreduce中的map任务通常一次只处理一个块中的数据,因此如果任务数太少,作业的运行速度就会比较慢。
2、HDFS的工作模式
HDFS采用master/slave架构,即一个namenode(管理者)多个datanode(工作者)。
namenode负责管理文件系统的命名空间。维护着文件系统树和整个树内所有的文件和目录,这些信息都保存在两个文件中,命名空间镜像文件和编辑日志文件。namenode也记录了每个文件中各个块所在的数据节点信息。datanode是文件系统的工作节点,它们需要存储并检索数据块(受客户端或namenode调度),并定期向namenode发送它们所存储的块的列表。
如果没有namenode,文件系统将无法使用,因为我们不知道如何根据datanode的块重建文件,所以对namenode进行容错是非常重要的。为此hadoop提供了两种机制。
第一种机制是备份那些组成文件系统元数据持久状态的文件。一般,在将持久化文件写入本地磁盘的同时,写入远程挂载的NFS。
第二种方法是运行一个辅助namenode,这个辅助namenode定期通过编辑日志合并命名空间镜像,并在本地保存合并后的命名空间镜像的副本,在namenode发生故障时启用。但是在主节点失效时,难免会丢失部分数据,这时可以把存储在NFS的namenode元数据复制到辅助的namenode上作为新的namenode运行。这其中涉及到故障转移的机制。稍后会做一点分析。
3、文件系统命名空间(namespace)
HDFS支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。
文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。HDFS支持用户磁盘配额和访问权限控制,目前还不支持硬链接和软链接。但是HDFS架构并不妨碍实现这些特性。
Namenode负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被Namenode记录下来。应用程序可以设置HDFS保存的文件的副本数目。文件副本的数目称为文件的副本系数&#