【问题标题】:Hadoop inode to pathHadoop inode 到路径
【发布时间】:2017-01-24 21:53:30
【问题描述】:

我使用“hdfs oiv”命令将 fsimage 读入 xml 文件。

hdfs oiv -p XML -i  /../dfs/nn/current/fsimage_0000000003132155181 -o fsimage.out

根据我的理解,fsimage 应该存储“块图”,例如文件如何分成块,以及每个块的存储位置。但是,下面是记录 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 路径......等等......)

名称服务器上的任何位置是否存在映射,包含:

  1. inode 映射的 HDFS 路径
  2. blockid 到本地文件系统路径/磁盘位置的映射?

【问题讨论】:

    标签: hadoop hdfs


    【解决方案1】:

    有点晚了,但是因为我现在正在调查这个并且偶然发现了你的问题。

    首先,有一点上下文。

    (我正在使用 Hadoop 2.6)

    名称服务器负责维护INodes,它是(虚拟)文件系统结构的内存表示,而Blocks 由数据节点维护。我认为 Name 节点不维护其余信息的原因有几个,例如指向每个 INode 中存储数据的数据节点的链接:

    • 需要更多内存来表示所有信息(内存是实际上限制可写入 HDFS 集群的文件数量的资源,因为整个结构都保存在 RAM 中,以便更快地访问)
    • 会在名称节点上产生更多工作负载,例如,如果文件从一个节点移动到另一个节点,或者安装了新节点并且需要将文件复制到该节点。每次发生时,名称节点都需要更新其状态。
    • 灵活性,因为 INode 是一个抽象,因此添加链接会将其绑定到确定的技术和通信协议

    现在回到你的问题:

    1. fsimage 文件已包含到 HDFS 路径的映射。如果您更仔细地查看 XML,每个 INode,无论其类型都有一个 ID(在您的情况下它是 37749299)。如果您进一步查看该文件,您可以找到 &lt;INodeDirectorySection&gt; 部分,其中包含父子之间的映射,并且正是此 ID 字段用于确定关系。通过&lt;name&gt; 属性,您可以轻松确定您在HDFS 资源管理器中看到的结构。
    2. 此外,您还有&lt;blocks&gt; 部分,它具有块ID(在您的情况下为1108336288)。如果您仔细查看 Hadoop 的源代码,您可以在 DatanodeUtil 中找到方法 idToBlockDir,它会提示您如何在磁盘上组织文件以及如何执行块 ID 映射。

    基本上原始 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_&lt;block_id&gt;命名格式的文件中存储块的位置。

    我不是 Hadoop 专家,所以如果有更好的理解这一点的人可以纠正我的逻辑中的任何流程,请这样做。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多