我使用'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路径......等等)
名称服务器上的任何位置是否包含映射,包含:
答案 0 :(得分:1)
有点晚了,但是因为我现在正在研究这个问题并且偶然发现了你的问题。
首先,有点背景。
(我正在使用Hadoop 2.6)
Name服务器负责维护INodes
,它是(虚拟)文件系统结构的内存中表示,而Blocks
由数据节点维护。我认为Name节点有几个原因不能维护其余的信息,比如指向数据存储在每个INode
内的数据节点的链接:
现在回到你的问题:
INode
,无论其类型是否具有ID(在您的情况下为37749299
)。如果您在文件中查看更多内容,可以找到<INodeDirectorySection>
部分,其中包含父级和子级之间的映射,此ID字段用于确定关系。通过<name>
属性,您可以轻松确定您在HDFS资源管理器中看到的结构。 <blocks>
部分,其中包含ID ID(在您的情况下为1108336288
)。如果仔细查看Hadoop的源代码,可以在idToBlockDir
中找到方法DatanodeUtil
,它可以提示如何在磁盘上组织文件并执行块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_<block_id>
命名格式的文件中存储块的地方。
我不是Hadoop专家,所以如果能够更好地理解这一点的人能够纠正我逻辑中的任何流程,请这样做。希望这会有所帮助。