我有一个关于 fsimage 中的元数据是什么的问题。我读到文件系统命名空间的所有突变,例如文件重命名、权限更改、文件创建、块分配都在 fsimage 内部。但是区块位置数据也是如此吗? 它是否还包含有关块存储在何处(在哪个数据节点上)的信息? 我从这个来源得到:http://bradhedlund.com/2011/09/10/understanding-hadoop-clusters-and-the-network/,存储块的元数据是由块报告构建的数据节点。 这是真的吗?那么 Fsimage 不包含有关块位置的信息?
Namenode维护两种类型的数据
块位置数据:由于文件被分成块,NN 应该知道哪一块在哪里。 这些数据保存在内存中,并且从不保留在磁盘上,DN定期与NN通信并共享块报告。
文件系统(元数据):例如文件系统层次结构、权限等。这些信息被持久化到磁盘
当 namenodes 启动时,它会从 fsimage 加载文件系统的“快照”,并将 edits 中的编辑日志应用到其上,在此过程之后我们得到一个新的快照。从此时起,namenode 可以接受来自客户端/DN 的文件系统请求
是的,据我所知,fsimage 不包含任何有关块的信息。该信息由数据节点存储。 Namenode 在从 datanodes 启动时获取此信息。
Hadoop提供了一个将fsimage文件转换为人类可读格式的工具。 http://hadoop.apache.org/docs/r2.3.0/hadoop-project-dist/hadoop-hdfs/HdfsImageViewer.html
输出示例:
bin/hdfs oiv -i fsimagedemo -p Indented -o fsimage.txt
FSImage
ImageVersion = -19
NamespaceID = 2109123098
GenerationStamp = 1003
INodes [NumInodes = 12]
Inode
INodePath =
Replication = 0
ModificationTime = 2009-03-16 14:16
AccessTime = 1969-12-31 16:00
BlockSize = 0
Blocks [NumBlocks = -1]
NSQuota = 2147483647
DSQuota = -1
Permissions
Username = theuser
GroupName = supergroup
PermString = rwxr-xr-x
...remaining output omitted...
首先,fs_image与Namenode内存中存储的数据不一样。
所以,fs_image 中没有块位置。
在HDFS中,Namenode中有持久化数据:EditLog和fs_image。
这些持久数据是为了HA(高可用性)。
当 NN(Namenoe) 由于任何问题而停机时,NN 内存中的数据就会消失。这是 HDFS 中的一个关键问题,因为我们不知道存在什么文件。
当 NN 恢复时,NN 加载 fs_image 并应用编辑日志数据来了解 HDFS 中存在哪些文件。
Ofc,当 HDFS 中有大量数据时,fs_image 是一种巨大的数据。当你有很多更改数据时,也会有很多编辑日志数据。 fs_image 和编辑日志之间存在合并检查点过程。但管理巨大的 fs_image 仍然存在一些危机。