前言
管理网络中跨多台计算机存储的文件系统称为分布式文件系统,该系统架构于网络之上,势必会引入网络编程的复杂性。
Hadoop 有一个称为 HDFS 的分布式文件系统,但实际上,Hadoop 是一个综合性的文件系统抽象,因此它也可以集成其他文件系统,比如本地文件系统和 Amazon S3系统。
HDFS 的设计
我们先来看看 HDFS 相关的一些名次,有一些是 HDFS 不支持的:
- 超大文件:HDFS 善于存储超大文件,比如几百 MB、几百 GB 甚至几百 TB 和 PB;
- 流式数据访问:适合于一次写入多次读取的场景;
- 商用硬件:其实就是指普通硬件,Hadoop 能够运行在普通硬件上;
- 低时延:HDFS 是为高数据吞吐量应用优化的,这是以提高时间延迟为代价的;
- 大量小文件:namenode 将文件系统的元数据存储在内存中,而无论文件大还是小,元数据都是差不多大的,所以存储 HDFS 能存储的文件数是有限制的;
- 多用户写,任意修改文件:HDFS 中的文件可能只有一个 writer,而且写操作总是将数据添加在文件的末尾。它不支持具有多个写入者的操作,也不允许在文件的任意位置进行修改。
HDFS 的概念
数据块
与普通的文件系统一样,HDFS 文件也以块为单位存储,只不过块大得多,默认为 64MB(好像较新的版本为 128MB)。但与其他文件系统不同的是,HDFS 中小于一个块大小的文件不会占据整个块的空间。
为何 HDFS 中的块如此之大?其目的是为了最小化寻址开销,如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。但是块也不能设置得太大,不然会导致 map 任务数过少,并行度不够高。
HDFS 的 fsck 指令可以显示块信息。
1 | hadoop fsck / -files -blocks |
namenode 和 datanode
HDFS 集群有两类节点以管理者-工作者模式运行,即一个 namenode 和多个 datanode。namenode 管理文件系统的命名空间,它维护者文件系统数以及整棵树内所有的文件和目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件。namenode 中也记录着每个文件中各个块所在的数据节点信息,但它并不永久保存块的位置信息,这些信息会在系统启动时由数据节点重建。
联邦 HDFS
namenode 在内存中保存文件系统每个文件和数据块的引用关系,这意味着对于一个拥有大量文件的超大集群来说,内存将成为限制系统横向扩展的瓶颈。在 2.x 发行版中引入的联邦 HDFS 允许系统通过添加 namenode 实现扩展,其中每个 namenode 管理文件系统命名空间的一部分。比如:一个 namenode 可能管理 /user 目录下的所有文件,另一个 namenode 管理 /share 下的所有文件。
在联邦环境下,每个 namenode 维护一个命名空间卷,包括命名空间的源数据和在该命名空间下的所有文件的所有数据块的数据块池。命名空间卷之间相互独立,两两之间并不通信。
HDFS 的高可用(HA)
数据高可用的前提是数据不会丢失,通过联合使用在多个文件系统中备份 namenode 的元数据和通过备用 namenode 创建监测点能防止数据丢失,但是仍然无法提供文件系统的高可用。namenode 依旧存在单点失效问题。
当 namenode 失效时,要想恢复服务,系统管理员需要启动一个拥有文件系统元数据副本的新的 namenode,并配置 datanode 和客户端以便使用这个新的 namenode。新的 namenode 直到满足以下情形才能响应服务:
- 将命名空间的映像导入内存中;
- 重做编辑日志;
- 接收到足够多的来自 datanode 的数据块报告并退出安全模式。
对于一个大型并拥有大量文件和数据块的集群,namenode 的冷启动需要 30 分钟甚至更长时间。
Hadoop 2.x 发行版针对上述问题在 HDFS 中增加了对高可用的支持。在这一实现中,配置了一对活动-备用 namenode。当活动 namenode 失效,备用 namenode 接会接管它的任务并开始服务于来自客户端的请求,不会有任何明显中断。实现这一目标需要在架构上做如下修改:
- namenode 之间需要通过高可用的共享存储实现编辑日志的共享;
- datanode 需要同时向两个 namenode 发送数据块处理报告;
- 客户端需要使用特定的机制来处理 namenode 的失效问题,这一机制应当对用户透明。
Hadoop 文件系统
Hadoop 有一个抽象的文件系统概念,HDFS 只是其中的一个实现。Java 抽象类 org.apache.hadoop.fs.FileSystem
定义了 Hadoop 中的一个文件系统接口,并且包含一些具体的实现,包括:Local、HDFS、HFTP、HSFTP、WebHDFS、HAR、hfs、FTP、S3等。
数据流
文件读取
待补充
文件写入
待补充
一致模型
待补充