hadoop inode到路径

ryevplcw  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(464)

我使用“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?

kninwzqo

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的源代码,您可以找到方法 idToBlockDirDatanodeUtil 这将提示您如何在磁盘上组织文件并执行块idMap。
基本上,原始id被移动了两次(16位和8位)。

int d1 = (int)((blockId >> 16) & 0xff);
int d2 = (int)((blockId >> 8) & 0xff);

最终的目录是使用获得的值构建的:

String path = DataStorage.BLOCK_SUBDIR_PREFIX + d1 + SEP + DataStorage.BLOCK_SUBDIR_PREFIX + d2;

在使用的文件中存储块的位置 blk_<block_id> 命名格式。
我不是hadoopMaven,所以如果有人更了解这一点,可以纠正我的逻辑中的任何流,请这样做。希望这有帮助。

相关问题