オフラインイメージビューアーガイド

概要

オフラインイメージビューアーは、hdfs fsimageファイルの内容を人間が読める形式でダンプし、Hadoopクラスターの名前空間のオフライン分析と検査を可能にするために、読み取り専用のWebHDFS APIを提供するツールです。このツールは、非常に大きなイメージファイルを比較的迅速に処理できます。このツールは、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とstepを指定して、整数の範囲[0, maxSize]を定義する必要があります。整数の範囲は、stepサイズのセグメントに分割されます: [0, s[1], …, s[n-1], maxSize]。プロセッサーは、システム内のファイルのうち、各セグメント[s[i-1], s[i])に分類されるファイルの数を計算します。maxSizeよりも大きいファイルは、常に最後のセグメントに分類されることに注意してください。デフォルトでは、出力ファイルはタブで区切られた2列の表としてフォーマットされます: サイズとNumFiles。サイズはセグメントの開始を表し、numFilesはこのセグメントに分類されるサイズのイメージからのファイル数です。オプション-formatを指定することにより、出力ファイルは、サイズ列に表示されるバイト数ではなく、人間が読める形式でフォーマットされます。さらに、サイズ列は、サイズ範囲列に変更されます。

  4. Delimited(実験的):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.

ユーザーは、次のシェルコマンドでビューアーにアクセスし、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...

ReverseXMLプロセッサー

ReverseXMLプロセッサーは、XMLプロセッサーの反対です。ユーザーは、-iおよび-oコマンドラインを介して入力XMLファイルと出力fsimageファイルを指定できます。

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

これにより、XMLファイルからfsimageが再構築されます。

FileDistributionプロセッサー

FileDistributionプロセッサーは、名前空間イメージ内のファイルサイズを分析できます。ユーザーは、-maxSizeおよび-stepコマンドラインを介して、maxSize(デフォルトは128GB)とstep(デフォルトは2MB)をバイト単位で指定できます。

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

プロセッサーは、システム内のファイルのうち、各セグメントに分類されるファイルの数を計算します。出力ファイルは、次の出力に示すように、タブで区切られた2列の表としてフォーマットされます。

   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

Delimitedプロセッサー

Delimitedプロセッサーは、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

設定されていない場合、Delimitedプロセッサーは、テキストを出力する前にメモリ内に名前空間を構築します。このプロセッサーの出力結果は、次の出力のようになります。

   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

DetectCorruptionプロセッサー

DetectCorruptionプロセッサーは、fsimageのエラーのテキスト表現を生成します(もしあれば)。次のケースが表示されます。

  1. inodeがfsimageで言及されているが、関連するメタデータが見つからない場合(CorruptNode)

  2. inodeに少なくとも1つの破損した子がある場合(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、またはこの2つの組み合わせを指定できます。IsSnapshotは、ノードがスナップショットに保持されているかどうかを示します。NodeType列には、ノードがinode、参照、または破損して不明であるかによって、Node、Ref、またはUnknownのいずれかを書き込むことができます。CorruptChildrenには、inodeに存在する可能性のある破損した子の数が含まれます。

オプション

フラグ 説明
-i|--inputFile 入力ファイル 処理する入力fsimageファイル(または、ReverseXMLプロセッサーを使用する場合はXMLファイル)を指定します。必須。
-o|--outputFile 出力ファイル 指定された出力プロセッサが出力ファイルを生成する場合、出力ファイル名を指定します。指定されたファイルがすでに存在する場合、警告なしに上書きされます。(デフォルトでは標準出力に出力)入力ファイルがXMLファイルの場合、<outputFile>.md5ファイルも作成されます。
-p|--processor プロセッサ 画像ファイルに適用する画像プロセッサを指定します。現在有効なオプションは、Web(デフォルト)、XMLDelimitedDetectCorruptionFileDistributionReverseXMLです。
-addr アドレス リッスンするアドレス(ホスト:ポート)を指定します(デフォルトはlocalhost:5978)。このオプションはWebプロセッサで使用されます。
-maxSize サイズ 解析対象となるファイルサイズの範囲[0, maxSize]をバイト単位で指定します(デフォルトは128GB)。このオプションはFileDistributionプロセッサで使用されます。
-step サイズ 分布の粒度をバイト単位で指定します(デフォルトは2MB)。このオプションはFileDistributionプロセッサで使用されます。
-format 出力結果を、バイト数ではなく人間が読みやすい形式でフォーマットします(デフォルトはfalse)。このオプションはFileDistributionプロセッサで使用されます。
-delimiter 区切り文字 DelimitedまたはDetectCorruptionプロセッサで使用する区切り文字列。
-t|--temp 一時ディレクトリ Delimited出力を生成するための中間結果をキャッシュするための一時ディレクトリを使用します。設定されていない場合、Delimitedプロセッサはテキストを出力する前にメモリ内で名前空間を構築します。
-h|--help ツールの使用法とヘルプ情報を表示して終了します。

結果の分析

オフライン画像ビューアを使用すると、hdfs名前空間に関する大量のデータを簡単に収集できます。この情報は、ファイルシステムの使用パターンを調べたり、任意の条件に一致する特定のファイルを検索したり、他の種類の名前空間分析に使用したりできます。

oiv_legacyコマンド

ProtocolBufferベースのfsimage(HDFS-5698)によって導入された内部レイアウトの変更により、OfflineImageViewerは過剰なメモリを消費し、Indentedプロセッサなどの一部の機能を失います。大量のメモリなしで処理する場合やこれらのプロセッサを使用する場合は、oiv_legacyコマンド(Hadoop 2.3のoivと同じ)を使用できます。

使用法

  1. スタンバイNameNodeまたはSecondaryNameNodeがチェックポイント中に古いfsimage形式で名前空間を保存するように、dfs.namenode.legacy-oiv-image.dirを適切なディレクトリに設定します。

  2. 古い形式のfsimageに対してoiv_legacyコマンドを使用します。

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

オプション

フラグ 説明
-i|--inputFile 入力ファイル 処理する入力fsimageファイルを指定します。必須です。
-o|--outputFile 出力ファイル 指定された出力プロセッサが出力ファイルを生成する場合、出力ファイル名を指定します。指定されたファイルがすでに存在する場合、警告なしに上書きされます。必須です。
-p|--processor プロセッサ 画像ファイルに適用する画像プロセッサを指定します。有効なオプションは、Ls(デフォルト)、XML、Delimited、Indented、FileDistribution、NameDistributionです。
-maxSize サイズ 解析対象となるファイルサイズの範囲[0, maxSize]をバイト単位で指定します(デフォルトは128GB)。このオプションはFileDistributionプロセッサで使用されます。
-step サイズ 分布の粒度をバイト単位で指定します(デフォルトは2MB)。このオプションはFileDistributionプロセッサで使用されます。
-format 出力結果を、バイト数ではなく人間が読みやすい形式でフォーマットします(デフォルトはfalse)。このオプションはFileDistributionプロセッサで使用されます。
-skipBlocks ファイル内の個々のブロックを列挙しません。これにより、非常に大きなファイルを持つ名前空間で処理時間と出力ファイルスペースを節約できます。Lsプロセッサは、ファイルサイズを正しく判断するためにブロックを読み取り、このオプションを無視します。
-printToScreen プロセッサの出力を指定されたファイルだけでなくコンソールにもパイプします。非常に大きな名前空間では、これにより処理時間が大幅に増加する可能性があります。
-delimiter 区切り文字 Delimitedプロセッサと組み合わせて使用すると、デフォルトのタブ区切り文字が区切り文字で指定された文字列に置き換えられます。
-h|--help ツールの使用法とヘルプ情報を表示して終了します。