1. 名称空间的定义
HDFS 的名称空间是一个逻辑上的文件系统目录树,类似于传统文件系统的目录结构。
组成
- 目录:用于组织文件的逻辑容器。
- 文件:存储在 HDFS 中的实际数据单元。
- 元数据:包括文件名、权限、所有者、文件大小、创建时间、修改时间等信息。
2. 名称空间的作用
名称空间的主要作用是:
- 组织文件
通过目录树的形式组织文件,方便用户管理和访问。 - 维护元数据
记录文件和目录的元数据信息(如权限、所有者、大小等)。 - 映射文件与数据块
记录每个文件对应的数据块(Block)列表,以及数据块在 DataNode 上的存储位置。
3. 名称空间的存储
(1)NameNode 内存
名称空间的元数据(包括目录树、文件元数据、文件与数据块的映射关系)存储在 NameNode 的内存中。
这是为了快速响应客户端的元数据操作请求(如创建文件、删除文件、列出目录等)。
(2)持久化存储:
为了确保元数据的高可用性,NameNode 会将名称空间的元数据持久化到磁盘中,存储在两个文件中:
- fsimage:名称空间的完整镜像文件,记录了某一时刻的完整元数据。
- edits 日志:记录对名称空间的所有修改操作(如创建文件、删除文件等),是一个追加写的日志文件。
4. 名称空间的操作
名称空间支持以下常见操作:
-
创建文件或目录
在名称空间中添加新的文件或目录。 -
删除文件或目录
从名称空间中移除文件或目录。 -
重命名文件或目录
修改文件或目录的名称。 -
列出目录内容
获取指定目录下的文件和子目录列表。 -
获取文件元数据
查询文件的元数据信息(如权限、大小、创建时间等)。
5. 名称空间与数据块的关系
每个文件在 HDFS 中被切分为一个或多个数据块(Block,默认大小为 128MB)。名称空间记录了每个文件对应的数据块列表。数据块实际存储在 DataNode 上,NameNode 通过名称空间中的映射关系定位数据块。
6. 名称空间的限制
(1)内存限制
名称空间的元数据存储在 NameNode 的内存中,因此 NameNode 的内存大小限制了名称空间的规模。每个文件或目录的元数据对象大约占用 150 字节的内存空间。如果有大量小文件,会导致 NameNode 内存压力过大。
(2)单点故障:
在非高可用(HA)模式下,NameNode 是单点故障,如果 NameNode 崩溃,名称空间将无法访问。
7. 名称空间的高可用性
在 Hadoop 2.x 及更高版本中,引入了 NameNode 高可用(HA) 方案,通过以下方式解决名称空间的单点故障问题:
- Active NameNode 和 Standby NameNode
两个 NameNode 同时运行,一个处于 Active 状态,负责处理客户端请求;另一个处于 Standby 状态,实时同步 Active NameNode 的名称空间。 - 共享存储(如 QJM 或 NFS)
Active NameNode 将 edits 日志写入共享存储,Standby NameNode 从共享存储读取 edits 日志并应用到自己的内存中,保持名称空间的实时同步。 - 故障切换
如果 Active NameNode 崩溃,Standby NameNode 会立即接管工作,确保名称空间的高可用性。
总结
HDFS 的名称空间是一个逻辑上的文件系统目录树,用于组织文件和目录,并维护元数据信息。名称空间的元数据存储在 NameNode 的内存中,并持久化到磁盘的 fsimage 和 edits 日志 文件中。
作用
- 组织文件和目录。
- 维护文件和目录的元数据。
- 映射文件与数据块的关系。
限制
- 受 NameNode 内存大小的限制。
- 在非 HA 模式下存在单点故障问题。
高可用性
通过 NameNode HA 方案解决单点故障问题。