• 数仓:解读 NameNode 的 edits 和 fsimage 文件内容


    一、edits 文件

    一)文件组成

    1. 一个edits文件记录了一次写文件的过程,该过程被分解成多个部分进行记录;(每条记录在hdfs中有一个编号)
    2. 每一个部分为: '<RECORD>...</RECORD>' ;
    3. 每一部分包含了:'<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)文件组成

    1. fsimage 由多个 '<INodeDirectorySection> ... </INodeDirectorySection>
    2. 每个 '<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>
  • 相关阅读:
    Javascript笔记部分
    JQuery学习笔记(3)
    WPF中批量进行验证操作
    学习sqlserver的函数方法
    .NET学习笔记(2)
    Asp.Net页面生命周期
    ThreadLocal
    NIO内存映射
    CAS基础和原子类
    Java锁概念基础
  • 原文地址:https://www.cnblogs.com/volcao/p/13858031.html
走看看 - 开发者的网上家园