Hadoop的fsck工具

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操作,因此可以考慮對該操作進行 權限控制,防止被誤操作。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章