离线映像查看器指南

概述

离线映像查看器是一个工具,用于将 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 格式的 FileStatus。

   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

处理器将计算系统中有多少文件属于每个段。输出文件格式为制表符分隔的两列表格,如下所示

   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. 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 地址 指定要侦听的地址(主机:端口)。(默认情况下为 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 消耗了过多的内存,并且丢失了一些功能,例如缩进处理器。如果你想在没有大量内存的情况下处理或使用这些处理器,则可以使用 oiv_legacy 命令(与 Hadoop 2.3 中的 oiv 相同)。

用法

  1. dfs.namenode.legacy-oiv-image.dir 设置为适当的目录,以使备用 NameNode 或 SecondaryNameNode 在检查点期间以旧 fsimage 格式保存其名称空间。

  2. 使用 oiv_legacy 命令处理旧格式 fsimage。

    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 处理器结合使用时,使用 arg 指定的字符串替换默认制表符分隔符。
-h|--help 显示工具用法和帮助信息,然后退出。