オフラインイメージビューアーは、hdfs fsimageファイルの内容を人間が読める形式でダンプし、Hadoopクラスターの名前空間のオフライン分析と検査を可能にするために、読み取り専用のWebHDFS APIを提供するツールです。このツールは、非常に大きなイメージファイルを比較的迅速に処理できます。このツールは、Hadoopバージョン2.4以降に含まれていたレイアウト形式を処理できます。古いレイアウト形式を処理する場合は、Hadoop 2.3のオフラインイメージビューアーまたはoiv_legacyコマンドを使用できます。ツールがイメージファイルを処理できない場合は、正常に終了します。オフラインイメージビューアーは、Hadoopクラスターの実行を必要としません。完全にオフラインで動作します。
オフラインイメージビューアーは、いくつかの出力プロセッサーを提供します。
Webはデフォルトの出力プロセッサーです。読み取り専用のWebHDFS APIを公開するHTTPサーバーを起動します。ユーザーは、HTTP REST APIを使用してインタラクティブに名前空間を調べることができます。セキュアモードもHTTPSもサポートしていません。
XMLは、fsimageのXMLドキュメントを作成し、fsimage内のすべての情報を含めます。このプロセッサーの出力は、XMLツールを使用した自動処理および分析に適しています。XML構文の詳細さのため、このプロセッサーは最大の出力も生成します。
FileDistributionは、名前空間イメージ内のファイルサイズを分析するためのツールです。このツールを実行するには、maxSizeとstepを指定して、整数の範囲[0, maxSize]を定義する必要があります。整数の範囲は、stepサイズのセグメントに分割されます: [0, s[1], …, s[n-1], maxSize]。プロセッサーは、システム内のファイルのうち、各セグメント[s[i-1], s[i])に分類されるファイルの数を計算します。maxSizeよりも大きいファイルは、常に最後のセグメントに分類されることに注意してください。デフォルトでは、出力ファイルはタブで区切られた2列の表としてフォーマットされます: サイズとNumFiles。サイズはセグメントの開始を表し、numFilesはこのセグメントに分類されるサイズのイメージからのファイル数です。オプション-formatを指定することにより、出力ファイルは、サイズ列に表示されるバイト数ではなく、人間が読める形式でフォーマットされます。さらに、サイズ列は、サイズ範囲列に変更されます。
Delimited(実験的):inodeと構築中のinodeの両方に共通するすべての要素を区切り文字で区切ってテキストファイルを生成します。デフォルトの区切り文字は\tですが、-delimiter引数を使用して変更できます。
DetectCorruption(実験的):イメージの一部を選択的にロードし、不整合を積極的に検索することにより、イメージの潜在的な破損を検出します。見つかった破損の要約を区切り形式で出力します。チェックは網羅的ではなく、名前空間の再構築中に不足しているノードのみをキャッチすることに注意してください。
ReverseXML(実験的):これはXMLプロセッサーの反対です。XMLファイルからfsimageを再構築します。このプロセッサーを使用すると、テスト用のfsimageを簡単に作成したり、破損が発生した場合にfsimageを手動で編集したりできます。
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プロセッサーは、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プロセッサーは、XMLプロセッサーの反対です。ユーザーは、-iおよび-oコマンドラインを介して入力XMLファイルと出力fsimageファイルを指定できます。
bash$ bin/hdfs oiv -p ReverseXML -i fsimage.xml -o fsimage
これにより、XMLファイルからfsimageが再構築されます。
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プロセッサーは、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プロセッサーは、fsimageのエラーのテキスト表現を生成します(もしあれば)。次のケースが表示されます。
inodeがfsimageで言及されているが、関連するメタデータが見つからない場合(CorruptNode)
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 (デフォルト)、XML 、Delimited 、DetectCorruption 、FileDistribution 、ReverseXML です。 |
-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名前空間に関する大量のデータを簡単に収集できます。この情報は、ファイルシステムの使用パターンを調べたり、任意の条件に一致する特定のファイルを検索したり、他の種類の名前空間分析に使用したりできます。
ProtocolBufferベースのfsimage(HDFS-5698)によって導入された内部レイアウトの変更により、OfflineImageViewerは過剰なメモリを消費し、Indentedプロセッサなどの一部の機能を失います。大量のメモリなしで処理する場合やこれらのプロセッサを使用する場合は、oiv_legacy
コマンド(Hadoop 2.3のoiv
と同じ)を使用できます。
スタンバイNameNodeまたはSecondaryNameNodeがチェックポイント中に古いfsimage形式で名前空間を保存するように、dfs.namenode.legacy-oiv-image.dir
を適切なディレクトリに設定します。
古い形式の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 |
ツールの使用法とヘルプ情報を表示して終了します。 |