HDFS的元数据fsimage和编辑日志edits

  |   0 评论   |   1,611 浏览

概述

在HDFS运行过程中,会在${dfs.namenode.name.dir}/current目录下形成如下文件列表,用于维护HDFS的文件系统信息及操作记录。

image.png

  • fsimage文件保存了最新的检查点信息,包含Hadoop文件系统中的所有目录和文件idnode的序列化信息;

  • edits负责保存自最新检查点后文件系统的所有更新操作,起着日志的作用;

  • edits_inprogress是当前正在使用中的edits文件,内容与edits相同;

针对这两种文件,hadoop分别提供了oiv和oev命令,可以离线查看该文件的内容

Offline Image Viewer

Offline Edits Viewer 是一个解析Edits 日志文件的工具。当前的processors 主要用于不同格式之间的转换,包括比本机二进制格式更易于编辑,同时也是人类可读的XML。

oiv是offline image viewer的缩写,用于将fsimage文件的内容转储到指定文件中以便于阅读。oiv在处理非常大的fsimage文件时是相当快的,如果该工具不能够处理fsimage,它会直接退出。该工具不具备向后兼容性,比如使用hadoop-2.4版本的oiv不能处理hadoop-2.3版本的fsimage,只能使用hadoop-2.3版本的oiv。同oev一样,就像它的名称所提示的(offline),oiv也不需要hadoop集群处于运行状态。oiv具体语法可以通过在命令行输入hdfs oiv查看。

oiv支持Ls、XML和FileDistribution等输出处理器,通过选项-p指定。Ls是默认的处理器,该处理器的输出与lsr命令的输出极其相似,以相同的顺序输出相同的字段,比如目录或文件的标志、权限、副本数量、所有者、组、文件大小、修改日期和全路径等。与lsr不同的是,该处理器的输出包含根路径/,另一个重要的不同是该处理器的输出不是按照目录名称和内容排序的,而是按照在fsimage中的顺序显示。除非命名空间包含较少的信息,否则不太可能直接比较该处理器和lsr命令的输出。Ls使用INode块中的信息计算文件大小并忽略-skipBlocks选项。

用法

Usage: bin/hdfs oiv [OPTIONS] -i INPUTFILE -o OUTPUTFILE
Offline Image Viewer
View a Hadoop fsimage INPUTFILE using the specified PROCESSOR,
saving the results in OUTPUTFILE.
The oiv utility will attempt to parse correctly formed image files
and will abort fail with mal-formed image files.
The tool works offline and does not require a running cluster in
order to process an image file.
The following image processors are available:
  * XML: This processor creates an XML document with all elements of
    the fsimage enumerated, suitable for further analysis by XML
    tools.
  * reverseXML: This processor takes an XML file and creates a
    binary fsimage containing the same elements.
  * FileDistribution: This processor analyzes the file size
    distribution in the image.
    -maxSize specifies the range [0, maxSize] of file sizes to be
     analyzed (128GB by default).
    -step defines the granularity of the distribution. (2MB by default)
  * Web: Run a viewer to expose read-only WebHDFS API.
    -addr specifies the address to listen. (localhost:5978 by default)
  * Delimited (experimental): Generate a text file with all of the elements common
    to both inodes and inodes-under-construction, separated by a
    delimiter. The default delimiter is \t, though this may be
    changed via the -delimiter argument.
Required command line arguments:
-i,--inputFile <arg>   FSImage or XML file to process.
Optional command line arguments:
-o,--outputFile <arg>  Name of output file. If the specified
                       file exists, it will be overwritten.
                       (output to stdout by default)
                       If the input file was an XML file, we
                       will also create an <outputFile>.md5 file.
-p,--processor <arg>   Select which type of processor to apply
                       against image file. (XML|FileDistribution|
                       ReverseXML|Web|Delimited)
                       The default is Web.
-delimiter <arg>       Delimiting string to use with Delimited processor.  
-t,--temp <arg>        Use temporary dir to cache intermediate result to generate
                       Delimited outputs. If not set, Delimited processor constructs
                       the namespace in memory before outputting text.
-h,--help              Display usage information and exit

Web Processor

基于fsimage文件启动webhdfs,等同于WebImageViewer

hdfs oiv -addr 0.0.0.0:5978 -i fsimage_0000000000002716042

image.png

使用浏览器访问

http://192.168.13.81:5978/webhdfs/v1/tmp?op=LISTSTATUS

image.png

命令行调用

hdfs dfs -ls webhdfs://127.0.0.1:5978/user

image.png

有关WebHDFS的详细用法,请参考《WebHDFS

XML

hdfs oiv -i fsimage_0000000000002716042 -o fsimage.xml -p XML

查看一下输出的文件

image.png

XML处理器输出fsimage的xml文档,包含了fsimage中的所有信息,比如inodeid等。该处理器的输出支持XML工具的自动化处理和分析,由于XML语法格式的冗长,该处理器的输出也最大。如下为简化版的xml

<?xml version="1.0"?>
<fsimage>
	<version>
		<layoutVersion>-60</layoutVersion>
		<onDiskVersion>1</onDiskVersion>
		<oivRevision>9b197d35839383c798c618ba917ccaa196a17699</oivRevision>
	</version>
	<NameSection>
		<namespaceId>666232578</namespaceId>
		<genstampV1>1000</genstampV1>
		<genstampV2>19267</genstampV2>
		<genstampV1Limit>0</genstampV1Limit>
		<lastAllocatedBlockId>1073760091</lastAllocatedBlockId>
		<txid>2716042</txid>
	</NameSection>
	<INodeSection>
		<lastInodeId>889510</lastInodeId>
		<numInodes>819</numInodes>
		<inode>
			<id>16385</id>
			<type>DIRECTORY</type>
			<name></name>
			<mtime>1526270634481</mtime>
			<permission>hdfs:supergroup:0755</permission>
			<nsquota>9223372036854775807</nsquota>
			<dsquota>-1</dsquota>
		</inode>
		<inode>
			<id>16389</id>
			<type>FILE</type>
			<name>hbase.version</name>
			<replication>3</replication>
			<mtime>1521455450036</mtime>
			<atime>1521514485313</atime>
			<preferredBlockSize>134217728</preferredBlockSize>
			<permission>hbase:hbase:0644</permission>
			<blocks>
				<block>
					<id>1073741825</id>
					<genstamp>1001</genstamp>
					<numBytes>7</numBytes>
				</block>
			</blocks>
			<storagePolicyId>0</storagePolicyId>
		</inode>
		<inode>
			<id>508055</id>
			<type>DIRECTORY</type>
			<name>system</name>
			<mtime>1526270634809</mtime>
			<permission>hdfs:supergroup:0755</permission>
			<nsquota>-1</nsquota>
			<dsquota>-1</dsquota>
		</inode>
	</INodeSection>
	<INodeReferenceSection></INodeReferenceSection>
	<SnapshotSection>
		<snapshotCounter>0</snapshotCounter>
		<numSnapshots>0</numSnapshots>
	</SnapshotSection>
	<INodeDirectorySection>
		<directory>
			<parent>16385</parent>
			<child>16387</child>
			<child>16419</child>
			<child>508055</child>
			<child>16386</child>
			<child>16434</child>
		</directory>
		<directory>
			<parent>16386</parent>
			<child>17255</child>
			<child>16416</child>
			<child>16481</child>
			<child>16433</child>
		</directory>
	</INodeDirectorySection>
	<FileUnderConstructionSection>
		<inode>
			<id>25699</id>
			<path>/hbase/MasterProcWALs/state-00000000000000000023.log</path>
		</inode>
		<inode>
			<id>889371</id>
			<path>/hbase/WALs/t2,60020,1521517416828/t2%2C60020%2C1521517416828.null0.1530345431557</path>
		</inode>
		<inode>
			<id>889377</id>
			<path>/hbase/WALs/t5,60020,1521517413142/t5%2C60020%2C1521517413142.null0.1530345479023</path>
		</inode>
		<inode>
			<id>889380</id>
			<path>/hbase/WALs/t3,60020,1521517415186/t3%2C60020%2C1521517415186.null0.1530345493350</path>
		</inode>
		<inode>
			<id>889383</id>
			<path>/hbase/WALs/t4,60020,1521517413473/t4%2C60020%2C1521517413473.null0.1530345516555</path>
		</inode>
		<inode>
			<id>889385</id>
			<path>/hbase/WALs/t4,60020,1521517413473/t4%2C60020%2C1521517413473.meta.1530345528148.meta</path>
		</inode>
	</FileUnderConstructionSection>
	<SecretManagerSection>
		<currentId>0</currentId>
		<tokenSequenceNumber>0</tokenSequenceNumber>
		<numDelegationKeys>0</numDelegationKeys>
		<numTokens>0</numTokens>
	</SecretManagerSection>
	<CacheManagerSection>
		<nextDirectiveId>1</nextDirectiveId>
		<numDirectives>0</numDirectives>
		<numPools>0</numPools>
	</CacheManagerSection>
</fsimage>

Offline Edits Viewer

oev是offline edits viewer(离线edits查看器)的缩写,该工具只操作文件,因而并不需要hadoop集群处于运行状态。


该工具提供了几个输出处理器,用于将输入文件转换为相关格式的输出文件,可以使用参数-p指定。目前支持的输出格式有binary(hadoop使用的二进制格式)、xml(在不使用参数p时的默认输出格式)和stats(输出edits文件的统计信息)。该工具支持的输入格式为binary和xml,其中的xml文件为该工具使用xml处理器的输出文件。由于没有与stats格式对应的输入文件,所以一旦输出为stats格式将不可以再转换为原有格式。比如输入格式为bianry,输出格式为xml,可以通过将输入文件指定为原来的输出文件,将输出文件指定为原来的输入文件实现binary和xml的转换,而stats则不可以

用法

Usage: bin/hdfs oev [OPTIONS] -i INPUT_FILE -o OUTPUT_FILE
Offline edits viewer
Parse a Hadoop edits log file INPUT_FILE and save results
in OUTPUT_FILE.
Required command line arguments:
-i,--inputFile <arg>   edits file to process, xml (case
                       insensitive) extension means XML format,
                       any other filename means binary format
-o,--outputFile <arg>  Name of output file. If the specified
                       file exists, it will be overwritten,
                       format of the file is determined
                       by -p option
Optional command line arguments:
-p,--processor <arg>   Select which type of processor to apply
                       against image file, currently supported
                       processors are: binary (native binary format
                       that Hadoop uses), xml (default, XML
                       format), stats (prints statistics about
                       edits file)
-h,--help              Display usage information and exit
-f,--fix-txids         Renumber the transaction IDs in the input,
                       so that there are no gaps or invalid                        transaction IDs.
-r,--recover           When reading binary edit logs, use recovery 
                       mode.  This will give you the chance to skip 
                       corrupt parts of the edit log.
-v,--verbose           More verbose output, prints the input and
                       output filenames, for processors that write
                       to a file, also output to screen. On large
                       image files this will dramatically increase
                       processing time (default is false).
Generic options supported are
-conf <configuration file>     specify an application configuration file
-D <property=value>            use value for given property
-fs <local|namenode:port>      specify a namenode
-jt <local|resourcemanager:port>    specify a ResourceManager
-files <comma separated list of files>    specify comma separated files to be copied to the map reduce cluster
-libjars <comma separated list of jars>    specify comma separated jar files to include in the classpath.
-archives <comma separated list of archives>    specify comma separated archives to be unarchived on the compute machines.
The general command line syntax is
bin/hadoop command [genericOptions] [commandOptions]

以xml格式查看

hdfs oev -i edits_0000000000002701438-0000000000002702448 -o edits.xml

输出示例如下,可见,里面是一行行的对HDFS的操作记录

<?xml version="1.0" encoding="UTF-8"?>
<EDITS>
  <EDITS_VERSION>-60</EDITS_VERSION>
  <RECORD>
    <OPCODE>OP_START_LOG_SEGMENT</OPCODE>
    <DATA>
      <TXID>2701438</TXID>
    </DATA>
  </RECORD>
  <RECORD>
    <OPCODE>OP_CLOSE</OPCODE>
    <DATA>
      <TXID>2701439</TXID>
      <LENGTH>0</LENGTH>
      <INODEID>0</INODEID>
      <PATH>/user/spark/applicationHistory/.958bb6fb-bd36-441f-a8f8-3f78dd7c435e</PATH>
      <REPLICATION>3</REPLICATION>
      <MTIME>1530296412532</MTIME>
      <ATIME>1530296409423</ATIME>
      <BLOCKSIZE>134217728</BLOCKSIZE>
      <CLIENT_NAME></CLIENT_NAME>
      <CLIENT_MACHINE></CLIENT_MACHINE>
      <OVERWRITE>false</OVERWRITE>
      <PERMISSION_STATUS>
        <USERNAME>spark</USERNAME>
        <GROUPNAME>spark</GROUPNAME>
        <MODE>420</MODE>
      </PERMISSION_STATUS>
    </DATA>
  </RECORD>
  <RECORD>
    <OPCODE>OP_DELETE</OPCODE>
    <DATA>
      <TXID>2701440</TXID>
      <LENGTH>0</LENGTH>
      <PATH>/user/spark/applicationHistory/.958bb6fb-bd36-441f-a8f8-3f78dd7c435e</PATH>
      <TIMESTAMP>1530296412545</TIMESTAMP>
      <RPC_CLIENTID>74c6abec-c6db-4d9a-81be-8dc1ac9d7c80</RPC_CLIENTID>
      <RPC_CALLID>4190176</RPC_CALLID>
    </DATA>
  </RECORD>
  <RECORD>
    <OPCODE>OP_ADD</OPCODE>
    <DATA>
      <TXID>2701441</TXID>
      <LENGTH>0</LENGTH>
      <INODEID>884802</INODEID>
      <PATH>/user/spark/applicationHistory/.f5a42075-09f3-44b5-a943-0c6a8a366c56</PATH>
      <REPLICATION>3</REPLICATION>
      <MTIME>1530296422563</MTIME>
      <ATIME>1530296422563</ATIME>
      <BLOCKSIZE>134217728</BLOCKSIZE>
      <CLIENT_NAME>DFSClient_NONMAPREDUCE_1569236321_1</CLIENT_NAME>
      <CLIENT_MACHINE>192.168.13.81</CLIENT_MACHINE>
      <OVERWRITE>true</OVERWRITE>
      <PERMISSION_STATUS>
        <USERNAME>spark</USERNAME>
        <GROUPNAME>spark</GROUPNAME>
        <MODE>420</MODE>
      </PERMISSION_STATUS>
      <RPC_CLIENTID>74c6abec-c6db-4d9a-81be-8dc1ac9d7c80</RPC_CLIENTID>
      <RPC_CALLID>4190178</RPC_CALLID>
    </DATA>
  </RECORD>
  <RECORD>
    <OPCODE>OP_DELETE</OPCODE>
    <DATA>
      <TXID>2702423</TXID>
      <LENGTH>0</LENGTH>
      <PATH>/user/spark/applicationHistory/.e93699cd-8a8d-411f-a007-ec08b4819a8b</PATH>
      <TIMESTAMP>1530299930596</TIMESTAMP>
      <RPC_CLIENTID>74c6abec-c6db-4d9a-81be-8dc1ac9d7c80</RPC_CLIENTID>
      <RPC_CALLID>4191741</RPC_CALLID>
    </DATA>
  </RECORD>
  <RECORD>
    <OPCODE>OP_END_LOG_SEGMENT</OPCODE>
    <DATA>
      <TXID>2702448</TXID>
    </DATA>
  </RECORD>
</EDITS>

查看统计信息

hdfs oev -i edits_0000000000002701438-0000000000002702448 -o stat.txt -p stats
    VERSION                             : -60
    OP_ADD                         (  0): 325
    OP_RENAME_OLD                  (  1): 5
    OP_DELETE                      (  2): 326
    OP_MKDIR                       (  3): null
    OP_SET_REPLICATION             (  4): null
    OP_DATANODE_ADD                (  5): null
    OP_DATANODE_REMOVE             (  6): null
    OP_SET_PERMISSIONS             (  7): null
    OP_SET_OWNER                   (  8): null
    OP_CLOSE                       (  9): 326
    OP_SET_GENSTAMP_V1             ( 10): null
    OP_SET_NS_QUOTA                ( 11): null
    OP_CLEAR_NS_QUOTA              ( 12): null
    OP_TIMES                       ( 13): 7
    OP_SET_QUOTA                   ( 14): null
    OP_RENAME                      ( 15): null
    OP_CONCAT_DELETE               ( 16): null
    OP_SYMLINK                     ( 17): null
    OP_GET_DELEGATION_TOKEN        ( 18): null
    OP_RENEW_DELEGATION_TOKEN      ( 19): null
    OP_CANCEL_DELEGATION_TOKEN     ( 20): null
    OP_UPDATE_MASTER_KEY           ( 21): null
    OP_REASSIGN_LEASE              ( 22): null
    OP_END_LOG_SEGMENT             ( 23): 1
    OP_START_LOG_SEGMENT           ( 24): 1
    OP_UPDATE_BLOCKS               ( 25): 5
    OP_CREATE_SNAPSHOT             ( 26): null
    OP_DELETE_SNAPSHOT             ( 27): null
    OP_RENAME_SNAPSHOT             ( 28): null
    OP_ALLOW_SNAPSHOT              ( 29): null
    OP_DISALLOW_SNAPSHOT           ( 30): null
    OP_SET_GENSTAMP_V2             ( 31): 5
    OP_ALLOCATE_BLOCK_ID           ( 32): 5
    OP_ADD_BLOCK                   ( 33): 5
    OP_ADD_CACHE_DIRECTIVE         ( 34): null
    OP_REMOVE_CACHE_DIRECTIVE      ( 35): null
    OP_ADD_CACHE_POOL              ( 36): null
    OP_MODIFY_CACHE_POOL           ( 37): null
    OP_REMOVE_CACHE_POOL           ( 38): null
    OP_MODIFY_CACHE_DIRECTIVE      ( 39): null
    OP_SET_ACL                     ( 40): null
    OP_ROLLING_UPGRADE_START       ( 41): null
    OP_ROLLING_UPGRADE_FINALIZE    ( 42): null
    OP_SET_XATTR                   ( 43): null
    OP_REMOVE_XATTR                ( 44): null
    OP_SET_STORAGE_POLICY          ( 45): null
    OP_INVALID                     ( -1): null


读后有收获可以支付宝请作者喝咖啡