这几天发现HDFS上的个别文件出现读取异常,使用 hdfs dfs -get 下载文件的话也会报错 “get: Cannot obtain block length for LocatedBlock” 信息。
hdfs dfs -get 报错信息:
1 | [hadoop@-client00 linshi]$ hdfs dfs -get /data/logs/dt=2018-12-24/mx.1545619356868 . |
出现这样问题的文件都是Flume产生的文件, 很可能是Flume在写文件的时候没有关闭写的操作,导致hadoop上的这个文件一直为 openforwrite 状态。或data node节点突然下线的情况也会出现。
- Flume客户端写入hdfs文件时的网络连接被不正常的关闭了
- Flume客户端写入hdfs失败了,而且其replication副本也丢失了
- HDFS文件租约未释放
(我们在Flume的日志中也看到了相应异常日志)
解决方法
查找这样的文件
首先我们需要找出这样的文件。
出现这种情况可以用fsck检查一下hdfs的文件系统
1 | hdfs fsck / |
这时你会发现没什么异常文件出现。 下面我在检查一遍。
1 | hdfs fsck / –openforwrite |
这时就会出现有问题的文件了。
For Example:
1 | ....................//data/logs/dt=2018-12-25/_mx_ticket_order_detail.1545895383766.tmp 578 bytes, 1 block(s), OPENFORWRITE: |
解决
我用释放租约的方式解决的这个问题
释放租约命令:
1 | hdfs debug recoverLease -path -retries |
我的命令是:
1 | hdfs debug recoverLease /data/logs/dt=2018-12-24/mx.1545619356868 |
之后再 get 这个文件就可以了, 问题解决!
如果你感觉文章还可以的话,请帮点点下面的广告。非常感谢!