hadoop Cannot obtain block length for LocatedBlock 解决

这几天发现HDFS上的个别文件出现读取异常,使用 hdfs dfs -get 下载文件的话也会报错 “get: Cannot obtain block length for LocatedBlock” 信息。

hdfs dfs -get 报错信息:

1
2
[hadoop@-client00 linshi]$ hdfs dfs -get /data/logs/dt=2018-12-24/mx.1545619356868 .
get: Cannot obtain block length for LocatedBlock{BP-2011896023-10.10.10.100-1494585324698:blk_1133914343_60174136; getBlockSize()=359; corrupt=false; offset=0; locs=[DatanodeInfoWithStorage[10.10.10.104:50010,DS-f83c59e0-b769-433e-92d3-db175fcd6717,DISK], DatanodeInfoWithStorage[10.10.10.102:50010,DS-a6654129-9355-4413-bd0c-98175a2b501c,DISK], DatanodeInfoWithStorage[10.10.10.103:50010,DS-53787b49-64bd-48d8-ac16-f6af4a233808,DISK]]}

出现这样问题的文件都是Flume产生的文件, 很可能是Flume在写文件的时候没有关闭写的操作,导致hadoop上的这个文件一直为 openforwrite 状态。或data node节点突然下线的情况也会出现。

  • Flume客户端写入hdfs文件时的网络连接被不正常的关闭了
  • Flume客户端写入hdfs失败了,而且其replication副本也丢失了
  • HDFS文件租约未释放

(我们在Flume的日志中也看到了相应异常日志)

解决方法

查找这样的文件

首先我们需要找出这样的文件。

出现这种情况可以用fsck检查一下hdfs的文件系统

1
hdfs fsck /

这时你会发现没什么异常文件出现。 下面我在检查一遍。

1
2
3
hdfs fsck / –openforwrite

hdfs fsck /data/logs –openforwrite # 检查具体目录

这时就会出现有问题的文件了。

For Example:

1
2
3
4
5
6
7
8
....................//data/logs/dt=2018-12-25/_mx_ticket_order_detail.1545895383766.tmp 578 bytes, 1 block(s), OPENFORWRITE: 
/data/logs/dt=2018-12-25/order_detail.1545895383766.tmp: MISSING 1 blocks of total size 578 B................................................................................
....................................................................................................
............../data/logs/dt=2018-12-26/_mx_ticket_order_detail.1545895204686.tmp 890 bytes, 1 block(s), OPENFORWRITE:
/data/logs/dt=2018-12-26/order_detail.1545895204686.tmp: MISSING 1 blocks of total size 890 B......................................................................................
................................................................................../data/logsdt=2018-12-27/_mx_ticket_order_detail.1545895289332.tmp 2367 bytes, 1 block(s), OPENFORWRITE:
/data/logs/dt=2018-12-27/detail.1545895289332.tmp: MISSING 1 blocks of total size 2367 B..................
...........................................................Status: CORRUPT
解决

我用释放租约的方式解决的这个问题

释放租约命令:

1
hdfs debug recoverLease -path -retries

我的命令是:

1
hdfs debug recoverLease /data/logs/dt=2018-12-24/mx.1545619356868

之后再 get 这个文件就可以了, 问题解决!

如果你感觉文章还可以的话,请帮点点下面的广告。非常感谢!

感谢您的支持!