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

摘要: 作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处

这几天想cat一下某天的HDFS文件内容的时候突然报Cannot obtain block length for LocatedBlock异常,get也一样,这样无法访问hdfs文件的问题必须解决,Mark一下问题背景和解决过程

一.问题背景

问题产生的原因可能是由于前几日Hadoop集群维护的时候,基础运维组操作不当,先关闭的Hadoop集群,然后才关闭的Flume agent导致的hdfs文件写入后状态不一致。排查和解决过程如下.

二.解决过程

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长度.

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

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文件已无异常,顺利显示内容,问题解决.

时间: 2024-10-11 23:29:43

Cannot obtain block length for LocatedBlock故障分析和解决的相关文章

[Hadoop] - 异常Cannot obtain block length for LocatedBlock

在Flume NG+hadoop的开发中,运行mapreduce的时候出现异常Error: java.io.IOException: Cannot obtain block length for LocatedBlock{BP-235416765-192.168.30.244-1430221967536:blk_1073889944_149172; getBlockSize()=45839; corrupt=false; offset=0; locs=[10.188.10.98:50010, 1

hadoop错误Could not obtain block blk_XXX_YYY from any node:java.io.IOException:No live nodes contain current block

错误: 10/12/08 20:10:31 INFO hdfs.DFSClient: Could not obtain block blk_XXXXXXXXXXXXXXXXXXXXXX_YYYYYYYY from any node: java.io.IOException: No live nodes contain current block. Will get new block locations from namenode and retry 原因: Datanode 有一个同时处理文件

502与504故障分析与解决方法

一. 戏说 不管你是做运维还是做开发,哪怕你是游客,时不时会遇到502 Bad Gateway或504 Gateway Time-out.出现这页面,把服务重启下,再实在不行重启下服务器,问题就解决了,但是,这问题还是会困扰着你,特别是做运维的人员.夜黑风高正酣睡时,一个电话响起,让你重启服务或IISRESET,肯定是极大不爽,立马要问候他妈了.呵呵,本文总结502与504故障分析与解决方法. 二. 状态码解释502 Bad Gateway:作为网关或者代理工作的服务器尝试执行请求时,从上游服务

对table的tr使用display:block显示colspan失效问题的解决

qqqq 1 <table> 2 <tr> 3 <td id="qqq" colspan="3" style="display:none;">qqq</td> 4 </tr> 5 <tr> 6 <td>1</td> 7 <td>1</td> 8 <td>1</td> 9 </tr> 10 &l

【异常】Specified key was too long;max key length is 767 bytes、解决由于HDFS格式化造成Hive数据全部丢失的问题

hive中可能会出现一个非常常见的异常:Specified key was too long;max key length is 767 bytes?是mysql/hive字符集问题.需要改变hive元数据库的字符集:mysql>alert database ruozedata character set latin1 然后重启hive,重启mysql. 由于HDFS进行了格式化,造成Hive的数据全部丢失,所以连接不上Hive.所以解决办法是:1)去mysql中删除Hive中创建的数据库(注意

启动VIP报CRS-1028/CRS-0223致使VIP状态为UNKNOWN故障分析与解决

CRS版本号为10.2.0.4 1.VIP State为UNKNOWN [[email protected] ~]# crs_stat -t Name           Type           Target    State     Host ------------------------------------------------------------ ora.dxp.db     application    ONLINE    ONLINE    XXdb1 ora....

Win10专业版常见开机故障分析及解决

微软已经正式向全球推送了Windows 10操作系统,与以往Windows产品不同的是,微软对windows7和Windows 8.1的用户施行免费升级的策略.同时,Windows 10也主要通过“升级”的方式进行安装,一些老机型在升级时遇到了很多问题,导致体验不友好.为了帮助大家顺利升级.安装.使用Windows 10系统,于是今天就来将一些升级Windows 10时常见的问题进行汇总解答. 焦点1,为何没有收到升级推送,或已经推送成功但没提示升级? 微软于7月29日正式向全球推送Window

Ubuntu安装SSH服务器故障分析及解决办法(错误1:E:软件包 openssh-server 还没有可供安装的候选者,错误2:E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系)

?    微博: 小样儿老师2015 Windows下做Linux开发需要SSH强大功能的支持.安装SSH的过程会出现了很多问题,看完这篇文章可以让你少走些弯路,PS:折腾一下午的成果. Ubuntu的apt-get工具的牛逼之处简直无人能及,Apt-get应用就是通过一个记录有所有可用软件包的配置文件,在服务器上查找你想要的可用软件包,然后下载并安装, 在终端输入命令行: $ sudo apt-get install openssh-server 出现错误: 完成正在分析软件包的依赖关系树正在

uwsgi出现invalid request block size: 21573 (max 4096)...skip解决办法

buffer-size uwsgi内部解析的数据包大小,默认4k. 如果准备接收大请求,你可以增长到64k. 允许uwsgi接收到32k,更大的会被丢弃. xweb.ini [uwsgi] socket = 127.0.0.1:9000 pidfile=/run/uwsgi.pid chdir = /xspeeder/xweb/ wsgi-file = xweb/wsgi.py master = true buffer-size = 65536 processes = 1 #threads =