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

来源:CSDNcss

做者:Syn良子 html

原文:https://blog.csdn.net/cssdongl/article/details/77750495 node

一.问题背景网络

问题产生的缘由多是因为前几日Hadoop集群维护的时候,基础运维组操做不当,先关闭的Hadoop集群,而后才关闭的Flume agent致使的hdfs文件写入后状态不一致。排查和解决过程以下.运维

二.解决过程oop

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

hdfs fsck /spa

固然你能够具体到指定的hdfs路径,检查完打印结果没有发现任何异常,没有发现损坏或者Corrupt的block,继续排查.net

2.那么加上其余参数细查debug

hdfs fsck / –openforwrite

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

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

那么分析其产生的可能性,举栗子以下

1>Flume客户端写入hdfs文件时的网络链接被不正常的关闭了

或者

2>Flume客户端写入hdfs失败了,并且其replication副本也丢失了

我这里应该属于第一种,总结一下就是Flume写入的hdfs文件因为什么缘由没有被正常close,状态不一致随后没法正常访问.继续排查

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

能够参考这篇文章来了解HDFS租约机制 http://www.cnblogs.com/cssdongl/p/6699919.html

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

可是结合当前场景因为先关闭的hadoop集群,后关闭的Flume sink hdfs,那么hadoop集群都关了,Flume还在对hdfs文件写入,那么租约最后释放了吗?答案是确定没释放.

4.恢复租约

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

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

请将<path-of-the-file>修改为你须要恢复的租约状态不一致的hdfs文件的具体路径,若是要恢复的不少,能够写个自动化脚原本找出须要恢复的全部文件而后统一恢复租约.

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

相关文章
相关标签/搜索