Cannot obtain block length for LocatedBlock故障分析和解决

一.问题背景

采用OGG进行数据实时同步时,发现同步的文件通过外部表不可读,cat一下某天的HDFS文件内容的时候报Cannot obtain block length for LocatedBlock异常

二.解决过程

1.既然是hdfs文件出问题,用fsck检查一下吧

hdfs fsck /

当然你可以具体到指定的hdfs路径,检查完打印结果没有发现任何异常,没有发现损坏或者Corrupt的block

2.那么加上其他参数细查

hdfs fsck / –openforwrite

ok,这次检查出来不少文件打印显示都是 openforwrite状态,而且我测试相应文件确实不能读取,这很不正常不是吗?Flume已经写过的hdfs文件居然还处于openforwrite状态,而且无法cat和get

所以这里的”Cannot obtain block length for LocatedBlock”结合字面意思讲应该是当前有文件处于写入状态尚未关闭,无法与对应的datanode通信来成功标识其block长度.

写入的hdfs文件由于什么原因没有被正常close,状态不一致随后无法正常访问.继续排查

3.推断:HDFS文件租约未释放

了解过HDFS租约后我们知道,客户端在每次读写HDFS文件的时候获取租约对文件进行读写,文件读取完毕了,然后再释放此租约.文件状态就是关闭的了。

OGG对hdfs文件写入,那么租约最后释放了吗?答案是肯定没释放.

4.恢复租约

对于这些状态损坏的文件来讲,rm掉的话是很暴力的做法,万一上游的数据已经没有rention呢?所以,既然没有释放租约,那么恢复租约close掉文件就是了,如下命令

hdfs debug recoverLease -path <path-of-the-file> -retries <retry times>

ok,执行完命令后再次cat对应hdfs文件已无异常,顺利显示内容,问题解决.

 

Cannot obtain block length for LocatedBlock故障分析和解决:http://www.mamicode.com/info-detail-1758075.html

HDFS租约机制:http://blog.csdn.net/androidlushangderen/article/details/52850349

posted @ 2020-02-06 16:46  葫芦杯  阅读(719)  评论(0编辑  收藏  举报