我使用“hdfs oiv”命令将fsimage读入xml文件。
hdfs oiv -p XML -i /../dfs/nn/current/fsimage_0000000003132155181 -o fsimage.out
根据我的理解,fsimage应该存储“块Map”,比如文件是如何被分解成块的,以及每个块存储的位置。然而,这里是如何记录 inode
看起来像是在输出文件中。
<inode>
<id>37749299</id>
<type>FILE</type>
<name>a4467282506298f8-e21f864f16b2e7c1_468511729_data.0.</name>
<replication>3</replication>
<mtime>1442259468957</mtime>
<atime>1454539092207</atime>
<perferredBlockSize>134217728</perferredBlockSize>
<permission>impala:hive:rw-r--r--</permission>
<blocks>
<block>
<id>1108336288</id>
<genstamp>35940487</genstamp>
<numBytes>16187048</numBytes>
</block>
</blocks>
</inode>
然而,我期望的是,一个文件的hdfs路径,这个文件如何被分解成更小的部分,以及每个部分都存储在哪里(比如哪台机器,哪个本地fs路径…等等)
名称服务器上是否有包含以下内容的Map:
hdfs路径到inodeMap
blockid到本地文件系统路径/磁盘位置的Map?
1条答案
按热度按时间kninwzqo1#
有点晚了,但因为我现在正在研究这个问题,无意中发现了你的问题。
首先,一点背景。
(我正在使用Hadoop2.6)
名称服务器负责维护
INodes
,它是(虚拟)文件系统结构的内存表示形式,而Blocks
由数据节点维护。我认为name node不维护其余信息有几个原因,比如指向数据节点的链接,其中数据存储在每个节点中INode
:它需要更多的内存来表示所有这些信息(内存是一种资源,它实际上限制了可以写入hdfs集群的文件的数量,因为整个结构都保存在ram中,以便更快地访问)
如果文件从一个节点移动到另一个节点,或者安装了新节点并且需要将文件复制到名称节点,则会在名称节点上产生更多的工作负载。每次发生这种情况时,name节点都需要更新其状态。
灵活性,因为inode是一个抽象,因此添加链接将把它绑定到确定的技术和通信协议
现在回到你的问题:
fsimage文件已经包含到hdfs路径的Map。如果您仔细查看xml,每个
INode
,无论其类型是否具有id(在您的情况下是37749299
). 如果您进一步查看文件,您可以找到该部分<INodeDirectorySection>
,它具有父级和子级之间的Map,并且此id字段用于确定关系。通过<name>
属性可以很容易地确定您在hdfs资源管理器中看到的结构。此外,你还有
<blocks>
节,该节具有块id(在您的情况下是1108336288
). 如果您仔细研究hadoop的源代码,您可以找到方法idToBlockDir
在DatanodeUtil
这将提示您如何在磁盘上组织文件并执行块idMap。基本上,原始id被移动了两次(16位和8位)。
最终的目录是使用获得的值构建的:
在使用的文件中存储块的位置
blk_<block_id>
命名格式。我不是hadoopMaven,所以如果有人更了解这一点,可以纠正我的逻辑中的任何流,请这样做。希望这有帮助。