如何在HDFS Hadoop中从块名(blockName)中查找文件

10

如何在HDFS中,通过块的名称或ID来找到与该块相关联的文件,有什么最简单的方法?

3个回答

17

不确定这是什么时候引入的,但你可以这样做

hdfs fsck -blockId <block_id>

hdfs fsck -blockId blk_1100790203
Connecting to namenode 
FSCK started by hdfs 

Block Id: blk_1100790203
Block belongs to: /tmp/1447685899336.txt

这比Chris的答案更快。我的HDFS版本是3.1.2。 - Eric

11

如果你可以读取所有文件(并且可以执行目录),则可以使用冗长和繁琐的方式:

hadoop fsck / -files -blocks | grep blk_520275863902385418_1002 -B 20

接着从你的块匹配位置往上扫描,直到找到前一个文件名:

/hadoop/mapred/system/jobtracker.info 4 bytes, 1 block(s):  OK
0. blk_520275863902385418_1002 len=4 repl=1
在这种情况下,blk_5202... 是 /hadoop/mapred/system/jobtracker.info 文件的一部分。
从程序上讲,没有一个接口可以通过块 ID 进行搜索,但是您可以查看次要名称节点的源代码,了解它如何 consolide the edits,并在次要名称节点的保存输出上进行实验(而不是冒险在活动名称节点文件上操作)。
祝你好运!

如果您在相对较大的集群上进行转换,可能需要更长时间。但是这将为您提供块大小和完整的块标识符,其中包括它所在的DataNode。 - Eric

2
选项1:如果使用blockId和generationStamp,则需要后缀.meta。
$ hdfs fsck -blockId blk_1073823706_82968.meta

选项2:使用没有generationStamp的blockId.
$ hdfs fsck -blockId blk_1073823706

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接