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文件已無異常,順利顯示內容,問題解決.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM