Hadoop的fsck工具

破棉襖發表於2014-07-28

HDFS支援fsck命令用以檢查各種不一致。fsck用以報告各種檔案問題,如block丟失或缺少block等。fack命令用法如下:

bin/hadoop fsck [-move | -delete | -openforwrite] [-files [-blocks [-locations | -racks]]]

       檢查的起始目錄

-move        將損壞的檔案移動到/lost+found下面

-delete        刪除損壞的檔案

-openforwrite    列印出正在寫的檔案

-files        列印出所有被檢查的檔案

-blocks        列印出block報告

-locations    列印出每個block的位置

-racks        列印出datanode的網路拓撲結構

預設情況下,fsck會忽略正在寫的檔案,使用-openforwrite選項可以彙報這種檔案。

 

下面是用命令列在一個測試叢集上執行fsck後的結果:

.......Status: HEALTHY

Total size: 32454532 B

Total dirs: 17

Total files: 7

Total blocks (validated): 7 (avg. block size 4636361 B)

Minimally replicated blocks: 7 (100.0 %)

Over-replicated blocks: 0 (0.0 %)

Under-replicated blocks: 0 (0.0 %)

Mis-replicated blocks: 0 (0.0 %)

Default replication factor: 3

Average block replication: 3.7142856

Corrupt blocks: 0

Missing replicas: 0 (0.0 %)

Number of data-nodes: 45

Number of racks: 1

 

需要注意的是在執行fsck命令列的客戶端必選在hadoop-site.xml中配置dfs.http.address項,即namenode的http地址。否則會丟擲java.net.ConnectException: Connection refused異常。其原因是fsck是namenode的一個servlet。而fsck命令對應的類DFSck其實是封裝了一個http連線,簡單的說就是抓取一個網頁。而這個網頁URL就是dfs.http.address配置項的value後面接上fsck,如。也就是說用瀏覽器開啟這個網頁和命令列執行fsck效果是一樣的。

namenode的這個Servlet類名是FsckServlet,它的doGet函式里定義了一個NamenodeFsck物件並執行起fsck()函式。fack()函式遞迴地從指定path遍歷所有的目錄和檔案,並根據選項確定要列印的內容。如果指定了-move選項,則損壞的檔案會被移動到/lost+found目錄,如果在根目錄下已經存在一個名為lost+found的檔案,則move操作會失敗並列印warning資訊。

對於大的叢集來說,對根目錄執行fsck操作是很耗時間的而且對namenode壓力很大,因此要謹慎使用。通常每天在叢集較空閒的時候執行一次以檢視資料狀況。另外由於任何使用者都可以在命令列或瀏覽器中執行fsck操作,因此可以考慮對該操作進行 許可權控制,防止被誤操作。

原文地址:http://blog.csdn.net/liangliyin/article/details/5872172

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29754888/viewspace-1239994/,如需轉載,請註明出處,否則將追究法律責任。

相關文章