本文主要内容翻译自:
https://hadoop.apache.org/docs/r3.1.1/hadoop-project-dist/hadoop-hdfs/HdfsEditsViewer.html
个人添加了几个命令的示例。
目录
- 概述
- 使用
- 命令使用说明
- XML processor
- binary processor
- State processor
- 案例学习:hadoop集群恢复
概述
HDFS中解析edit log的工具是 Offile Edits Viewer,对应的命令是hdfs oev。当前的processor主要用于不同格式之间的转换,包括XML,和native binary,相比native binary,XML是人类可读且易于编辑的格式。
该工具只对文件进行操作,不需要运行Hadoop集群。
支持的输入格式:
- binary: native binary format ,hadoop内部使用
- xml: XML format, 由xml processor生成,在文件扩展名为.xml(不区分大小写)时使用。
注意:XML/二进制格式输入文件不允许由同一类型的处理器处理。
Offline Edits Viewer提供了几种输出processor(除非另有说明,否则处理器的输出可以转换回原始编辑文件):
- 二进制:Hadoop内部使用的本机二进制格式
- xml:XML格式
- stats:打印统计信息,无法将其转换回编辑文件
使用
命令使用介绍
$ hdfs oev -h
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.
XML/Binary format input file is not allowed
to be processed by the same type processor.
-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).
选项说明:
- -i,–inputFile : 必选,指定输入文件
- -o,–outputFile : 必选,指定输出文件
- -p,–processor :可选,指定processor,默认是XML
- -r,–recover: 可选,读取binary格式文件时,可以是recovery模式,这将忽略edit log中corrupt的部分
- -v,–verbose: 可选,verbose模式。在写入文件的时候,同时会写到屏幕中
XML processor
$ bin/hdfs oev -p xml -i edits -o edits.xml
或
$ bin/hdfs oev -i edits -o edits.xml
示例如下:
$ hdfs oev -i current/edits_0000000000007961554-0000000000007961630 -o edit.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<EDITS>
<EDITS_VERSION>-64</EDITS_VERSION>
<RECORD>
<OPCODE>OP_START_LOG_SEGMENT</OPCODE>
<DATA>
<TXID>7961554</TXID>
</DATA>
</RECORD>
<RECORD>
<OPCODE>OP_ADD</OPCODE>
<DATA>
<TXID>7961555</TXID>
<LENGTH>0</LENGTH>
<INODEID>2216852</INODEID>
<PATH>/var/log/hadoop-spark/.8e3ea7ad-51fe-42a4-82ef-3fe43d8cc175</PATH>
<REPLICATION>3</REPLICATION>
<MTIME>1563958515153</MTIME>
<ATIME>1563958515153</ATIME>
<BLOCKSIZE>268435456</BLOCKSIZE>
<CLIENT_NAME>DFSClient_NONMAPREDUCE_38132218_1</CLIENT_NAME>
<CLIENT_MACHINE>192.168.10.4</CLIENT_MACHINE>
<OVERWRITE>true</OVERWRITE>
<PERMISSION_STATUS>
<USERNAME>hadoop</USERNAME>
<GROUPNAME>hadoop</GROUPNAME>
<MODE>420</MODE>
</PERMISSION_STATUS>
<ERASURE_CODING_POLICY_ID>0</ERASURE_CODING_POLICY_ID>
<RPC_CLIENTID>48789ad8-39fe-427f-afdc-10e4d9d4a8a5</RPC_CLIENTID>
<RPC_CALLID>9001462</RPC_CALLID>
</DATA>
</RECORD>
...
...
binary processor
将XML格式的文件反解析为binary格式,用以重构edit log。
$ bin/hdfs oev -p binary -i edits.xml -o edits
使用示例:
$ hdfs oev -i edit.xml -o editlog -p binary -v
input [edit.xml]
output [editlog]
State processor
State processor用于聚合editlog文件中包含的操作代码计数。
bin/hdfs oev -p stats -i edits -o edits.stats
使用示例:
$ hdfs oev -i edit.xml -o edit.stats -p stats -v
input [edit.xml]
output [edit.stats]
VERSION : -64
OP_ADD ( 0): 25
OP_RENAME_OLD ( 1): 0
OP_DELETE ( 2): 25
OP_MKDIR ( 3): 0
OP_SET_REPLICATION ( 4): 0
OP_DATANODE_ADD ( 5): 0
OP_DATANODE_REMOVE ( 6): 0
OP_SET_PERMISSIONS ( 7): 0
OP_SET_OWNER ( 8): 0
OP_CLOSE ( 9): 25
OP_SET_GENSTAMP_V1 ( 10): 0
OP_SET_NS_QUOTA ( 11): 0
OP_CLEAR_NS_QUOTA ( 12): 0
OP_TIMES ( 13): 0
OP_SET_QUOTA ( 14): 0
OP_RENAME ( 15): 0
OP_CONCAT_DELETE ( 16): 0
OP_SYMLINK ( 17): 0
OP_GET_DELEGATION_TOKEN ( 18): 0
OP_RENEW_DELEGATION_TOKEN ( 19): 0
OP_CANCEL_DELEGATION_TOKEN ( 20): 0
OP_UPDATE_MASTER_KEY ( 21): 0
OP_REASSIGN_LEASE ( 22): 0
OP_END_LOG_SEGMENT ( 23): 1
OP_START_LOG_SEGMENT ( 24): 1
OP_UPDATE_BLOCKS ( 25): 0
OP_CREATE_SNAPSHOT ( 26): 0
OP_DELETE_SNAPSHOT ( 27): 0
OP_RENAME_SNAPSHOT ( 28): 0
OP_ALLOW_SNAPSHOT ( 29): 0
OP_DISALLOW_SNAPSHOT ( 30): 0
OP_SET_GENSTAMP_V2 ( 31): 0
OP_ALLOCATE_BLOCK_ID ( 32): 0
OP_ADD_BLOCK ( 33): 0
OP_ADD_CACHE_DIRECTIVE ( 34): 0
OP_REMOVE_CACHE_DIRECTIVE ( 35): 0
OP_ADD_CACHE_POOL ( 36): 0
OP_MODIFY_CACHE_POOL ( 37): 0
OP_REMOVE_CACHE_POOL ( 38): 0
OP_MODIFY_CACHE_DIRECTIVE ( 39): 0
OP_SET_ACL ( 40): 0
OP_ROLLING_UPGRADE_START ( 41): 0
OP_ROLLING_UPGRADE_FINALIZE ( 42): 0
OP_SET_XATTR ( 43): 0
OP_REMOVE_XATTR ( 44): 0
OP_SET_STORAGE_POLICY ( 45): 0
OP_TRUNCATE ( 46): 0
OP_APPEND ( 47): 0
OP_SET_QUOTA_BY_STORAGETYPE ( 48): 0
OP_ADD_ERASURE_CODING_POLICY ( 49): 0
OP_ENABLE_ERASURE_CODING_POLIC ( 50): 0
OP_DISABLE_ERASURE_CODING_POLI ( 51): 0
OP_REMOVE_ERASURE_CODING_POLIC ( 52): 0
OP_INVALID ( -1): 0
上述的每个OpCode都会对应NameNode的特定操作。
案例学习:hadoop集群恢复
如果Hadoop集群出现问题,并且编辑文件已损坏,则可以保存至少部分正确的编辑文件。这可以通过将二进制编辑转换为XML来完成,手动编辑它,然后将其转换回二进制。最常见的问题是编辑文件缺少关闭记录(操作码-1的记录)。工具应该能够识别这一点,并且XML格式应该正确关闭。
如果XML文件中没有结束记录,可以在最后一条正确记录之后添加一条。操作码为-1的记录之后的任何内容都将被忽略。
结束记录示例(操作码-1)
<RECORD>
<OPCODE>-1</OPCODE>
<DATA>
</DATA>
</RECORD>