数仓:解读 NameNode 的 edits 和 fsimage 文件内容
一、edits 文件
一)文件组成
- 一个edits文件记录了一次写文件的过程,该过程被分解成多个部分进行记录;(每条记录在hdfs中有一个编号)
- 每一个部分为: '<RECORD>...</RECORD>' ;
- 每一部分包含了:'<OPCODE> ... </OPCODE>' 和 '<DATA> ... </DATA>' 两部分内容;
二)文件内容理解
1. 文件首: <OPCODE>OP_START_LOG_SEGMENT</OPCODE>
-
<RECORD> <OPCODE>OP_START_LOG_SEGMENT</OPCODE> --- 表示对一次写操作记录的开始 <DATA> <TXID>138</TXID> ---------- HDFS的第138号记录 </DATA> </RECORD>
2. 文件的元数据: <OPCODE>OP_ADD</OPCODE>
# a.xml._COPYING_: 写入 'a.xml' 文件的过程中,会先将文件写到该临时文件中,最后再将该文件重命名后存放到DN;
-
<RECORD> <OPCODE>OP_ADD</OPCODE> ------------- 写文件操作 <DATA> <TXID>139</TXID> ---------------- HDFS的第139号记录 <LENGTH>0</LENGTH> <INODEID>16416</INODEID> <PATH>/a.xml._COPYING_</PATH> --- 写'a.xml'文件的过程中生成临时文件'a.xml._COPYING' <REPLICATION>3</REPLICATION> --- 副本数 <MTIME>1603341874966</MTIME> --- 创建时间 <ATIME>1603341874966</ATIME> --- 修改时间 <BLOCKSIZE>134217728</BLOCKSIZE> --- 文件块的大小:128M <CLIENT_NAME>DFSClient_NONMAPREDUCE_-1327338057_1</CLIENT_NAME> ---- 来源哪个客户端 <CLIENT_MACHINE>192.168.26.101</CLIENT_MACHINE> --------------- 通过哪个机器上传的 <OVERWRITE>true</OVERWRITE> --------------- 是否允许被覆盖 <PERMISSION_STATUS> ---------- 权限信息 <USERNAME>heyc</USERNAME> ---------- 所属主 <GROUPNAME>supergroup</GROUPNAME> ---------- 所属组 <MODE>420</MODE> ---------- 权限大小(777最大) </PERMISSION_STATUS> <RPC_CLIENTID>3299ce83-ba14-4468-8cf8-b5edb5dea153</RPC_CLIENTID> ---- 集群ID <RPC_CALLID>3</RPC_CALLID> </DATA> </RECORD>
3. 定义块id:<OPCODE>OP_ALLOCATE_BLOCK_ID</OPCODE>
-
<RECORD> <OPCODE>OP_ALLOCATE_BLOCK_ID</OPCODE> ---- 表示该步为记录 “定义块ID” <DATA> <TXID>140</TXID> ---- HDFS的第140号记录 <BLOCK_ID>1073741835</BLOCK_ID> ----- 块ID </DATA> </RECORD>
4. 为块生成一个时间戳:<OPCODE>OP_SET_GENSTAMP_V2</OPCODE>
-
<RECORD> <OPCODE>OP_SET_GENSTAMP_V2</OPCODE> <DATA> <TXID>141</TXID> <GENSTAMPV2>1012</GENSTAMPV2> </DATA> </RECORD>
5. 添加块: <OPCODE>OP_ADD_BLOCK</OPCODE>
-
<RECORD> <OPCODE>OP_ADD_BLOCK</OPCODE> <DATA> <TXID>142</TXID> <PATH>/a.xml._COPYING_</PATH> <BLOCK> <BLOCK_ID>1073741835</BLOCK_ID> <NUM_BYTES>0</NUM_BYTES> <GENSTAMP>1012</GENSTAMP> </BLOCK> <RPC_CLIENTID></RPC_CLIENTID> <RPC_CALLID>-2</RPC_CALLID> </DATA> </RECORD>
6. 封闭文件: <OPCODE>OP_CLOSE</OPCODE>
-
<RECORD> <OPCODE>OP_CLOSE</OPCODE> <DATA> <TXID>143</TXID> <LENGTH>0</LENGTH> <INODEID>0</INODEID> <PATH>/a.xml._COPYING_</PATH> <REPLICATION>3</REPLICATION> <MTIME>1603341875516</MTIME> <ATIME>1603341874966</ATIME> <BLOCKSIZE>134217728</BLOCKSIZE> <CLIENT_NAME></CLIENT_NAME> <CLIENT_MACHINE></CLIENT_MACHINE> <OVERWRITE>false</OVERWRITE> <BLOCK> <BLOCK_ID>1073741835</BLOCK_ID> <NUM_BYTES>313</NUM_BYTES> <GENSTAMP>1012</GENSTAMP> </BLOCK> <PERMISSION_STATUS> <USERNAME>heyc</USERNAME> <GROUPNAME>supergroup</GROUPNAME> <MODE>420</MODE> </PERMISSION_STATUS> </DATA> </RECORD>
7. 重命名临时文件 'a.xml._COPYING_' 为 'a.xml': <OPCODE>OP_RENAME_OLD</OPCODE>
-
<RECORD> <OPCODE>OP_RENAME_OLD</OPCODE> <DATA> <TXID>144</TXID> <LENGTH>0</LENGTH> <SRC>/a.xml._COPYING_</SRC> <DST>/a.xml</DST> <TIMESTAMP>1603341875552</TIMESTAMP> <RPC_CLIENTID>3299ce83-ba14-4468-8cf8-b5edb5dea153</RPC_CLIENTID> <RPC_CALLID>8</RPC_CALLID> </DATA> </RECORD>
二、fsimage 文件
1)文件组成
- fsimage 由多个 '<INodeDirectorySection> ... </INodeDirectorySection>'
- 每个 '<INodeDirectorySection> ... </INodeDirectorySection>' 中有多个 '<inode> ... </inode>'
2)文件内容理解
-
<inode> <id>16417</id> <type>FILE</type> ------ 文件类型:常规文件(如果是文件夹则为 'DIRECTORY') <name>b.xml</name> ----- 文件名 <replication>3</replication> --- 副本数 <mtime>1603342078483</mtime> --- 创建时间 <atime>1603342078253</atime> --- 修改时间 <perferredBlockSize>134217728</perferredBlockSize> --- 块大小 <permission>heyc:supergroup:rw-r--r--</permission> --- 权限 <blocks> ---- 被切成了几个块 <block> --- 一个快 <id>1073741836</id> ----- 块的id <genstamp>1013</genstamp> --- 块的时间戳 <numBytes>313</numBytes> --- 块中存放的数据的大小(该文件只有一个块,该大小即为文件大小) </block> </blocks> </inode>