離線映像檢視器指南

概觀

離線映像檢視器是一個工具,用於將 hdfs fsimage 檔案的內容傾印到人類可讀的格式,並提供唯讀 WebHDFS API,以便允許離線分析和檢查 Hadoop 群集的命名空間。此工具能夠相對快速地處理非常大的映像檔案。此工具處理 Hadoop 版本 2.4 及更高版本中包含的佈局格式。如果您想處理較舊的佈局格式,可以使用 Hadoop 2.3 的離線映像檢視器或 oiv_legacy 指令。如果工具無法處理映像檔案,它將正常退出。離線映像檢視器不需要 Hadoop 群集正在執行;它在操作中完全離線。

離線映像檢視器提供多個輸出處理器

  1. Web 是預設的輸出處理器。它會啟動一個公開唯讀 WebHDFS API 的 HTTP 伺服器。使用者可以使用 HTTP REST API 互動式地調查名稱空間。它不支援安全模式,也不支援 HTTPS。

  2. XML 會建立一個 fsimage 的 XML 文件,並包含 fsimage 中的所有資訊。這個處理器的輸出適合使用 XML 工具進行自動化處理和分析。由於 XML 語法的冗長,這個處理器也會產生最多的輸出。

  3. FileDistribution 是用來分析名稱空間映像中檔案大小的工具。為了執行這個工具,應該透過指定 maxSize 和一個步驟來定義一個整數範圍 [0, maxSize]。整數範圍會被分割成大小為步驟的區段:[0, s[1], …, s[n-1], maxSize],而處理器會計算系統中有多少檔案落在每個區段 [s[i-1], s[i])。請注意,大於 maxSize 的檔案總是會落在最後一個區段。預設情況下,輸出檔案會以分隔符號分隔的兩欄位表格格式化:大小和檔案數。其中大小表示區段的開始,而檔案數是映像中大小落在這個區段的檔案數。透過指定 -format 選項,輸出檔案會以人類可讀的方式格式化,而不是大小欄位中顯示的位元組數。此外,大小欄位會變更為大小範圍欄位。

  4. 分隔(實驗性質):產生一個文字檔案,其中包含所有 inode 和正在建立中的 inode 共有的元素,並以分隔符號分隔。預設的分隔符號是 \t,不過這可以透過 -delimiter 參數來變更。

  5. DetectCorruption(實驗性質):透過選擇性地載入映像的某些部分並主動搜尋不一致,來偵測映像的潛在毀損。以分隔格式輸出找到的毀損摘要。請注意,這個檢查並非詳盡的,而且只會在名稱空間重建期間擷取遺失的節點。

  6. ReverseXML(實驗性質):這是 XML 處理器的相反操作;它會從 XML 檔案重建一個 fsimage。這個處理器可以輕鬆地建立用於測試的 fsimage,並在毀損時手動編輯 fsimage。

用法

Web 處理器

Web 處理器會啟動一個公開唯讀 WebHDFS API 的 HTTP 伺服器。使用者可以使用 -addr 選項指定要監聽的位址(預設為 localhost:5978)。

   bash$ bin/hdfs oiv -i fsimage
   14/04/07 13:25:14 INFO offlineImageViewer.WebImageViewer: WebImageViewer
   started. Listening on /127.0.0.1:5978. Press Ctrl+C to stop the viewer.

使用者可以使用下列 shell 指令存取檢視器並取得 fsimage 的資訊

   bash$ bin/hdfs dfs -ls webhdfs://127.0.0.1:5978/
   Found 2 items
   drwxrwx--* - root supergroup          0 2014-03-26 20:16 webhdfs://127.0.0.1:5978/tmp
   drwxr-xr-x   - root supergroup          0 2014-03-31 14:08 webhdfs://127.0.0.1:5978/user

若要取得所有檔案和目錄的資訊,你可以直接使用下列指令

   bash$ bin/hdfs dfs -ls -R webhdfs://127.0.0.1:5978/

使用者也可以透過 HTTP REST API 取得 JSON 格式的 FileStatuses。

   bash$ curl -i http://127.0.0.1:5978/webhdfs/v1/?op=liststatus
   HTTP/1.1 200 OK
   Content-Type: application/json
   Content-Length: 252

   {"FileStatuses":{"FileStatus":[
   {"fileId":16386,"accessTime":0,"replication":0,"owner":"theuser","length":0,"permission":"755","blockSize":0,"modificationTime":1392772497282,"type":"DIRECTORY","group":"supergroup","childrenNum":1,"pathSuffix":"user"}
   ]}}

Web 處理器現在支援下列操作

XML 處理器

XML 處理器用於傾印 fsimage 中的所有內容。使用者可透過 -i 和 -o 命令列指定輸入和輸出檔案。

   bash$ bin/hdfs oiv -p XML -i fsimage -o fsimage.xml

這將建立一個名為 fsimage.xml 的檔案,其中包含 fsimage 中的所有資訊。對於非常大的映像檔,此程序可能需要數分鐘。

將離線映像檢視器套用至 XML 處理器會產生以下輸出

   <?xml version="1.0"?>
   <fsimage>
   <NameSection>
     <genstampV1>1000</genstampV1>
     <genstampV2>1002</genstampV2>
     <genstampV1Limit>0</genstampV1Limit>
     <lastAllocatedBlockId>1073741826</lastAllocatedBlockId>
     <txid>37</txid>
   </NameSection>
   <INodeSection>
     <lastInodeId>16400</lastInodeId>
     <inode>
       <id>16385</id>
       <type>DIRECTORY</type>
       <name></name>
       <mtime>1392772497282</mtime>
       <permission>theuser:supergroup:rwxr-xr-x</permission>
       <nsquota>9223372036854775807</nsquota>
       <dsquota>-1</dsquota>
     </inode>
   ...remaining output omitted...

反向 XML 處理器

反向 XML 處理器與 XML 處理器相反。使用者可透過 -i 和 -o 命令列指定輸入 XML 檔案和輸出 fsimage 檔案。

   bash$ bin/hdfs oiv -p ReverseXML -i fsimage.xml -o fsimage

這將從 XML 檔案重建一個 fsimage。

檔案分佈處理器

檔案分佈處理器可以分析名稱空間映像中的檔案大小。使用者可透過 -maxSize 和 -step 命令列,以位元組為單位指定 maxSize(預設為 128GB)和 step(預設為 2MB)。

   bash$ bin/hdfs oiv -p FileDistribution -maxSize maxSize -step size -i fsimage -o output

處理器將計算系統中有多少檔案落在各個區段中。輸出檔案格式為分隔兩個欄位的表格,如下所示

   Size	NumFiles
   4	1
   12	1
   16	1
   20	1
   totalFiles = 4
   totalDirectories = 2
   totalBlocks = 4
   totalSpace = 48
   maxFileSize = 21

若要讓輸出結果更易於閱讀,使用者還可以另外指定 -format 選項。

   bash$ bin/hdfs oiv -p FileDistribution -maxSize maxSize -step size -format -i fsimage -o output

這將產生以下輸出

   Size Range	NumFiles
   (0 B, 4 B]	1
   (8 B, 12 B]	1
   (12 B, 16 B]	1
   (16 B, 21 B]	1
   totalFiles = 4
   totalDirectories = 2
   totalBlocks = 4
   totalSpace = 48
   maxFileSize = 21

分隔處理器

分隔處理器會產生 fsimage 的文字表示,每個元素都以分隔字串(預設為 \t)分隔。使用者可以透過 -delimiter 選項指定新的分隔字串。

   bash$ bin/hdfs oiv -p Delimited -delimiter delimiterString -i fsimage -o output

此外,使用者可以透過以下命令指定暫存目錄來快取中間結果

   bash$ bin/hdfs oiv -p Delimited -delimiter delimiterString -t temporaryDir -i fsimage -o output

如果未設定,分隔處理器會在輸出文字之前在記憶體中建構名稱空間。此處理器的輸出結果應如下所示

   Path	Replication	ModificationTime	AccessTime	PreferredBlockSize	BlocksCount	FileSize	NSQUOTA	DSQUOTA	Permission	UserName	GroupName
   /	0	2017-02-13 10:39	1970-01-01 08:00	0	0	0	9223372036854775807	-1	drwxr-xr-x	root	supergroup
   /dir0	0	2017-02-13 10:39	1970-01-01 08:00	0	0	0	-1	-1	drwxr-xr-x	root	supergroup
   /dir0/file0	1	2017-02-13 10:39	2017-02-13 10:39	134217728	1	1	0	0	-rw-r--r--	root	supergroup
   /dir0/file1	1	2017-02-13 10:39	2017-02-13 10:39	134217728	1	1	0	0	-rw-r--r--	root	supergroup
   /dir0/file2	1	2017-02-13 10:39	2017-02-13 10:39	134217728	1	1	0	0	-rw-r--r--	root	supergroup

偵測損毀處理器

偵測損毀處理器會產生 fsimage 錯誤的文字表示(如果有任何錯誤)。它會顯示以下情況

  1. fsimage 中提到一個 inode,但找不到相關的元資料(CorruptNode)

  2. 一個 inode 至少有一個損毀的子節點(MissingChildren)

分隔字串可以使用 -delimiter 選項提供,而處理器可以使用 -t 選項快取中間結果。

    bash$ bin/hdfs oiv -p DetectCorruption -delimiter delimiterString -t temporaryDir -i fsimage -o output

如果未找到損毀,此處理器的輸出結果會是空的,否則會以以下格式找到的項目

    CorruptionType	Id	IsSnapshot	ParentPath	ParentId	Name	NodeType	CorruptChildren
    MissingChild	16385	false	/	Missing		Node	1
    MissingChild	16386	false	/	16385	dir0	Node	2
    CorruptNode	16388	true		16386		Unknown	0
    CorruptNode	16389	true		16386		Unknown	0
    CorruptNodeWithMissingChild	16391	true		16385		Unknown	1
    CorruptNode	16394	true		16391		Unknown	0

CorruptionType 欄位可以是 MissingChild、CorruptNode 或這兩者的組合。IsSnapshot 會顯示節點是否保留在快照中。根據節點是 inode、參考或損毀且未知,NodeType 欄位可以寫入 Node、Ref 或 Unknown。CorruptChildren 包含 inode 可能有的損毀子節點數目。

選項

旗標 說明
-i|--inputFile 輸入檔案 指定要處理的輸入 fsimage 檔案 (或 XML 檔案,如果使用 ReverseXML 處理器)。必填。
-o|--outputFile 輸出檔案 指定輸出檔名,如果指定的輸出處理器產生一個檔名。如果指定的檔案已存在,它會被靜默覆寫。(預設輸出至 stdout) 如果輸入檔案是 XML 檔案,它也會建立一個 <outputFile>.md5。
-p|--processor 處理器 指定要對影像檔案套用的影像處理器。目前有效的選項有 Web (預設)、XMLDelimitedDetectCorruptionFileDistributionReverseXML
-addr 位址 指定要監聽的位址 (host:port)。(預設為 localhost:5978)。此選項與 Web 處理器一起使用。
-maxSize 大小 指定要以位元組分析的檔案大小範圍 [0, maxSize] (預設為 128GB)。此選項與 FileDistribution 處理器一起使用。
-step 大小 指定分佈的粒度,以位元組為單位 (預設為 2MB)。此選項與 FileDistribution 處理器一起使用。
-format 以人類可讀的方式格式化輸出結果,而不是數字位元組。(預設為 false)。此選項與 FileDistribution 處理器一起使用。
-delimiter arg 與 Delimited 或 DetectCorruption 處理器一起使用的分隔字串。
-t|--temp 暫存目錄 使用暫存目錄快取中間結果以產生 Delimited 輸出。如果未設定,Delimited 處理器會在輸出文字前在記憶體中建構命名空間。
-h|--help 顯示工具使用方式和說明資訊,然後結束。

分析結果

離線影像檢視器可以輕鬆收集大量關於 hdfs 命名空間的資料。然後,這些資訊可用於探索檔案系統使用模式或尋找符合任意條件的特定檔案,以及其他類型的命名空間分析。

oiv_legacy 指令

由於 ProtocolBuffer 為基礎的 fsimage (HDFS-5698) 引入了內部佈局變更,離線影像檢視器會消耗過多的記憶體,並失去一些功能,例如縮排處理器。如果您想在不使用大量記憶體的情況下處理,或使用這些處理器,您可以使用 oiv_legacy 指令 (與 Hadoop 2.3 中的 oiv 相同)。

用法

  1. dfs.namenode.legacy-oiv-image.dir 設定為適當的目錄,讓備用 NameNode 或 SecondaryNameNode 在檢查點期間以舊 fsimage 格式儲存其命名空間。

  2. 對舊格式 fsimage 使用 oiv_legacy 指令。

    bash$ bin/hdfs oiv_legacy -i fsimage_old -o output
    

選項

旗標 說明
-i|--inputFile 輸入檔案 指定要處理的輸入 fsimage 檔案。必填。
-o|--outputFile 輸出檔案 指定輸出檔案名稱,如果指定的輸出處理器產生一個。如果指定的文件已存在,它會被靜默覆寫。必填。
-p|--processor 處理器 指定要對影像檔套用的影像處理器。有效選項為 Ls(預設值)、XML、分隔、縮排、FileDistribution 和 NameDistribution。
-maxSize 大小 指定要以位元組分析的檔案大小範圍 [0, maxSize] (預設為 128GB)。此選項與 FileDistribution 處理器一起使用。
-step 大小 指定分佈的粒度,以位元組為單位 (預設為 2MB)。此選項與 FileDistribution 處理器一起使用。
-format 以人類可讀的方式格式化輸出結果,而不是數字位元組。(預設為 false)。此選項與 FileDistribution 處理器一起使用。
-skipBlocks 不列舉檔案中的個別區塊。這可能會節省處理時間和具有非常大檔案的命名空間的 outfile 檔案空間。Ls 處理器會讀取區塊以正確判斷檔案大小,並忽略此選項。
-printToScreen 將處理器的輸出導向至主控台以及指定的檔案。在極大的命名空間上,這可能會將處理時間增加一個數量級。
-delimiter arg 當與分隔處理器一起使用時,會以 arg 指定的字串取代預設的 tab 分隔符號。
-h|--help 顯示工具使用方式和說明資訊,然後結束。