HDFS支援fsck命令用以檢查各種不一致。fsck用以報告各種檔案問題,如block丟失或缺少block等。fack命令用法如下:
bin/hadoop fsck [-move | -delete | -openforwrite] [-files [-blocks [-locations | -racks]]]
<path> 檢查的起始目錄
-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,如http://10.249.65.1:50070/fsck。也就是說用瀏覽器開啟這個網頁和命令列執行fsck效果是一樣的。
namenode的這個Servlet類名是FsckServlet,它的doGet函數裡定義了一個NamenodeFsck對象並執行起fsck()函數。fack()函數遞迴地從指定path遍曆所有的目錄和檔案,並根據選項確定要列印的內容。如果指定了-move選項,則損壞的檔案會被移動到/lost+found目錄,如果在根目錄下已經存在一個名為lost+found的檔案,則move操作會失敗並列印warning資訊。
對於大的叢集來說,對根目錄執行fsck操作是很耗時間的而且對namenode壓力很大,因此要謹慎使用。通常每天在叢集較閒置時候執行一次以查看資料狀況。另外由於任何使用者都可以在命令列或瀏覽器中執行fsck操作,因此可以考慮對該操作進行 許可權控制,防止被誤操作。