Cannot obtain block length for LocatedBlock故障分析与解决
2017-11-13 13:17
260 查看
在执行hive任务的时候经常会遇到如下错误:
上层任务执行失败,导致后续任务积压,因此必须解决该问题。
解决方法:
1.首先使用fsck检查一下
hdfs fsck /
当然也可以指定具体的hdfs路径。检查完打印结果没发现任何异常,没发现任何损坏或CORRUPT的block,继续排查。
2.加上其他参数细查
hdfs fsck / -openforwrite
这次检查出来不少文件打印显示都是 openforwrite状态,而且Status为CORRUPT。经测试发现,这些文件无法get和cat。所以这里的“ Cannot obtain block length for LocatedBlock ”结合字面意思讲应该是当前有文件处于写入状态尚未关闭,无法与对应的datanode通信来成功标识其block长度。
那么分析其产生的可能性,举例子如下 :
Flume客户端写入hdfs文件时的网络连接被不正常的关闭了 ;
Flume客户端写入hdfs失败了,而且其replication副本也丢失了 。
总结一下就是Flume写入的hdfs文件由于什么原因没有被正常close,状态不一致随后无法正常访问。
上图中主要存在两个问题:一是块丢失;二是副本数量为2(正常情况下为3)。针对此类问题,最好的方法是重新上传原日志,分两种情况解决:
1.原日志存在
显然,找到原日志,重新上传。
2.原日志不存在
原日志不存在时,针对副本数量缺失的情况,可以先get到本地,删除HDFS上相应的文件,然后重新put到HDFS。针对块丢失的情况,依然如此。只不过是在get的过程中坏块无法get到本地,只能get正常的块。所有get到本地的块均正常,然后再put到HDFS,问题解决(此方法适用于有坏块或MISSING block的情况)。
如要删除坏块,使用 hdfs fsck -delete命令。
查询资料发现可以用恢复租约的方法解决,不过我还没尝试过,粘贴下链接,可以了解下。https://www.cnblogs.com/cssdongl/p/6700512.html
Caused by: java.io.IOException: Cannot obtain block length for LocatedBlock{BP-739651031-192.168.1.50-1452872943245:blk_1329315607_256707953; getBlockSize()=6604762; corrupt=false; offset=0; locs=[192.168.1.55:50010, 192.168.1.56:50010, 192.168.1.53:50010, 192.168.1.71:50010]; storageIDs=[DS-52f0d1de-8124-4ce1-a452-028474f3beee, DS-be33d88c-3d30-4b5f-816c-e7e8344fd573, DS-3d2fd42f-912b-4805-b7a5-e05f99caa6ff, DS-6b4a5d88-d23e-4348-a6e0-7869cef21277]; storageTypes=[DISK, DISK, DISK, DISK]}
上层任务执行失败,导致后续任务积压,因此必须解决该问题。
解决方法:
1.首先使用fsck检查一下
hdfs fsck /
当然也可以指定具体的hdfs路径。检查完打印结果没发现任何异常,没发现任何损坏或CORRUPT的block,继续排查。
2.加上其他参数细查
hdfs fsck / -openforwrite
这次检查出来不少文件打印显示都是 openforwrite状态,而且Status为CORRUPT。经测试发现,这些文件无法get和cat。所以这里的“ Cannot obtain block length for LocatedBlock ”结合字面意思讲应该是当前有文件处于写入状态尚未关闭,无法与对应的datanode通信来成功标识其block长度。
那么分析其产生的可能性,举例子如下 :
Flume客户端写入hdfs文件时的网络连接被不正常的关闭了 ;
Flume客户端写入hdfs失败了,而且其replication副本也丢失了 。
总结一下就是Flume写入的hdfs文件由于什么原因没有被正常close,状态不一致随后无法正常访问。
上图中主要存在两个问题:一是块丢失;二是副本数量为2(正常情况下为3)。针对此类问题,最好的方法是重新上传原日志,分两种情况解决:
1.原日志存在
显然,找到原日志,重新上传。
2.原日志不存在
原日志不存在时,针对副本数量缺失的情况,可以先get到本地,删除HDFS上相应的文件,然后重新put到HDFS。针对块丢失的情况,依然如此。只不过是在get的过程中坏块无法get到本地,只能get正常的块。所有get到本地的块均正常,然后再put到HDFS,问题解决(此方法适用于有坏块或MISSING block的情况)。
如要删除坏块,使用 hdfs fsck -delete命令。
查询资料发现可以用恢复租约的方法解决,不过我还没尝试过,粘贴下链接,可以了解下。https://www.cnblogs.com/cssdongl/p/6700512.html
相关文章推荐
- Cannot obtain block length for LocatedBlock故障分析和解决
- Cannot obtain block length for LocatedBlock故障分析和解决
- [解决]java.io.IOException: Cannot obtain block length for LocatedBlock
- [解决]java.io.IOException: Cannot obtain block length for LocatedBlock
- [解决]java.io.IOException: Cannot obtain block length for LocatedBlock
- [解决]java.io.IOException: Cannot obtain block length for LocatedBlock
- ORA-19573: cannot obtain exclusive enqueue for datafile XXX 解决方法
- for循环中变量i始终为length值的分析与解决
- 修改记录字段值时错误Row cannot be located for updating的解决方法
- Cannot find source for binding with reference原因分析与解决方法 -[WPF开发]
- 解决“Row cannot be located for updating. Some values may have been changed since it was last read.”的问题
- 解决 js报错:Uncaught TypeError- Cannot use 'in' operator to search for 'length' in [{"id":"636","...
- Cannot obtain license for Assembler (feature armasm) with license version >= 3.1
- QT出现 Cannot create children for a parent that is in a different thread 的解决方法:
- 故障解决:Failure adding assembly to the cache: Access denied. You might not have administrative credentials to perform this task. Contact your system administrator for assistance.
- ora-01552 :cannot use system rollback segment for non-system tablespace 解决
- 实例分析解决死锁导致网站无法访问故障
- VFS: Cannot open root device "nfs" or unknown-block(0,255)错误的解决
- XMLHttpRequest cannot load:...Cross origin requests are only supported for...问题的解决之路(bug描述太长)