美文网首页大数据技术
大数据技术之HDFS(五)

大数据技术之HDFS(五)

作者: pauls | 来源:发表于2021-04-15 08:22 被阅读0次

NameNode 和 和 SecondaryNameNode

5.1 NN 和 和 2NN 工作机制

思考:NameNode 中的元数据是存储在哪里的?

首先,我们做个假设,如果存储在 NameNode 节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。因此,元数据需要存放在内存中。但如果只存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据的FsImage。

这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新 FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦 NameNode 节点断电,就会产生数据丢失。因此,引入 Edits 文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到 Edits 中。这样,一旦 NameNode 节点断电,可以通过 FsImage 和 Edits 的合并,合成元数据。

但是,如果长时间添加数据到 Edits 中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行 FsImage 和 Edits 的合并,如果这个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于 FsImage 和 Edits 的合并。

NameNode工作机制

NN工作机制
  • 1 ) 第一 阶段:NameNode 启动

(1)第一次启动 NameNode 格式化后,创建 Fsimage 和 Edits 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。

(2)客户端对元数据进行增删改的请求。

(3)NameNode 记录操作日志,更新滚动日志。

(4)NameNode 在内存中对元数据进行增删改。

  • 2 ) 第二 阶段:Secondary NameNode 工作

(1)Secondary NameNode 询问 NameNode 是否需要 CheckPoint。直接带回 NameNode是否检查结果。

(2)Secondary NameNode 请求执行 CheckPoint。

(3)NameNode 滚动正在写的 Edits 日志。

(4)将滚动前的编辑日志和镜像文件拷贝到 Secondary NameNode。

(5)Secondary NameNode 加载编辑日志和镜像文件到内存,并合并。

(6)生成新的镜像文件 fsimage.chkpoint。

(7)拷贝 fsimage.chkpoint 到 NameNode。

(8)NameNode 将 fsimage.chkpoint 重新命名成 fsimage。

5.2 Fsimage 和 和 Edits 解析

Fsimage和Edits概念

  • 1 )oiv 查看 Fsimage 文件

(1)查看 oiv 和 oev 命令

[sl@hadoop102 current]$ hdfs 
oiv apply the offline fsimage viewer 
to an fsimage oev apply the offline edits viewer to an edits file

(2)基本语法

hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径

(3)案例实操

[sl@hadoop102 current]$ pwd 
/opt/module/hadoop-3.1.3/data/dfs/name/current 
[sl@hadoop102 current]$ hdfs oiv -p XML -i 
fsimage_0000000000000000025 -o /opt/module/hadoop-3.1.3/fsimage.xml 
[sl@hadoop102 current]$ cat /opt/module/hadoop-3.1.3/fsimage.xml

将显示的 xml 文件内容拷贝到 Idea 中创建的 xml 文件中,并格式化。部分显示结果如下。

<inode> 
      <id>16386</id> 
      <type>DIRECTORY</type> 
      <name>user</name> 
      <mtime>1512722284477</mtime>   
      <permission>sl:supergroup:rwxr-xr-x</permission>   
      <nsquota>-1</nsquota> 
      <dsquota>-1</dsquota> 
</inode> 
<inode>   
      <id>16387</id> 
      <type>DIRECTORY</type> 
      <name>sl</name> 
      <mtime>1512790549080</mtime>   
      <permission>sl:supergroup:rwxr-xr-x</permission>     
      <nsquota>-1</nsquota> 
      <dsquota>-1</dsquota> 
</inode> 
<inode> 
      <id>16389</id> 
      <type>FILE</type> 
      <name>wc.input</name> 
      <replication>3</replication> 
      <mtime>1512722322219</mtime> 
      <atime>1512722321610</atime>     
      <perferredBlockSize>134217728</perferredBlockSize>     
      <permission>sl:supergroup:rw-r--r--</permission> 
      <blocks>
           <block> 
              <id>1073741825</id> 
              <genstamp>1001</genstamp>
              <numBytes>59</numBytes> 
            </block> 
      </blocks> 
</inode >

思考:可以看出,Fsimage 中没有记录块所对应 DataNode,为什么?

在集群启动后,要求 DataNode 上报数据块信息,并间隔一段时间后再次上报。

  • 2 )oev 查看 Edits 文件

(1)基本语法

hdfs oev -p 文件类型 -i 编辑日志 -o 转换后文件输出路径

(2)案例实操

[sl@hadoop102 current]$ hdfs oev -p XML -i 
edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop- 3.1.3/edits.xml
[sl@hadoop102 current]$ cat /opt/module/hadoop-3.1.3/edits.xml

将显示的 xml 文件内容拷贝到 Idea 中创建的 xml 文件中,并格式化。显示结果如下。

<?xml version="1.0" encoding="UTF-8"?> 
<EDITS> 
    <EDITS_VERSION>-63</EDITS_VERSION> 
    <RECORD> 
        <OPCODE>OP_START_LOG_SEGMENT</OPCODE> 
        <DATA> 
            <TXID>129</TXID> 
        </DATA> 
    </RECORD> 
    <RECORD> 
        <OPCODE>OP_ADD</OPCODE> 
        <DATA> 
            <TXID>130</TXID> 
            <LENGTH>0</LENGTH> 
            <INODEID>16407</INODEID> 
            <PATH>/hello7.txt</PATH> 
            <REPLICATION>2</REPLICATION>   
            <MTIME>1512943607866</MTIME> 
            <ATIME>1512943607866</ATIME>     
            <BLOCKSIZE>134217728</BLOCKSIZE>     
            <CLIENT_NAME>DFSClient_NONMAPREDUCE_- 1544295051_1</CLIENT_NAME> 
            <CLIENT_MACHINE>192.168.10.102</CLIENT_MACHINE>     
            <OVERWRITE>true</OVERWRITE> 
            <PERMISSION_STATUS>   
                 <USERNAME>sl</USERNAME> 
                 <GROUPNAME>supergroup</GROUPNAME> 
                 <MODE>420</MODE> 
            </PERMISSION_STATUS> 
            <RPC_CLIENTID>908eafd4-9aec-4288-96f1- e8011d181561</RPC_CLIENTID> 
            <RPC_CALLID>0</RPC_CALLID> 
        </DATA> 
    </RECORD> 
    <RECORD> <OPCODE>OP_ALLOCATE_BLOCK_ID</OPCODE> 
  <DATA> 
    <TXID>131</TXID> 
    <BLOCK_ID>1073741839</BLOCK_ID> 
  </DATA> 
</RECORD> 
<RECORD> 
    <OPCODE>OP_SET_GENSTAMP_V2</OPCODE> 
    <DATA> 
        <TXID>132</TXID> 
        <GENSTAMPV2>1016</GENSTAMPV2> 
    </DATA> 
</RECORD> 
<RECORD> 
    <OPCODE>OP_ADD_BLOCK</OPCODE> 
    <DATA> 
        <TXID>133</TXID> 
        <PATH>/hello7.txt</PATH>
        <BLOCK> 
            <BLOCK_ID>1073741839</BLOCK_ID>             
            <NUM_BYTES>0</NUM_BYTES>             
            <GENSTAMP>1016</GENSTAMP> 
      </BLOCK> 
      <RPC_CLIENTID></RPC_CLIENTID> 
      <RPC_CALLID>-2</RPC_CALLID>
 </DATA> 
</RECORD>
<RECORD> 
    <OPCODE>OP_CLOSE</OPCODE> 
    <DATA> 
        <TXID>134</TXID> 
        <LENGTH>0</LENGTH> 
        <INODEID>0</INODEID> 
        <PATH>/hello7.txt</PATH>
        <REPLICATION>2</REPLICATION> 
        <MTIME>1512943608761</MTIME> 
        <ATIME>1512943607866</ATIME> 
        <BLOCKSIZE>134217728</BLOCKSIZE>
        <CLIENT_NAME></CLIENT_NAME>
         <CLIENT_MACHINE></CLIENT_MACHINE>         
         <OVERWRITE>false</OVERWRITE> 
        <BLOCK>
             <BLOCK_ID>1073741839</BLOCK_ID>       
            <NUM_BYTES>25</NUM_BYTES>   
            <GENSTAMP>1016</GENSTAMP>
      </BLOCK> 
      <PERMISSION_STATUS> 
      <USERNAME>sl</USERNAME> 
      <GROUPNAME>supergroup</GROUPNAME>     
      <MODE>420</MODE> 
      </PERMISSION_STATUS> 
    </DATA> 
  </RECORD> 
</EDITS >

思考:NameNode 如何确定下次开机启动的时候合并哪些 Edits?

5.3 CheckPoint 时间设置

  • 1 ) 通常 情况下,SecondaryNameNode 每隔 一小时执行一次 。

[hdfs-default.xml]

<property> 
    <name>dfs.namenode.checkpoint.period</name>           
    <value>3600s</value> 
</property>
  • 2) 一分钟 检查一次操作次数,当操作次数达到 1 百万 时,SecondaryNameNode 执行 一次。
<property> 
      <name>dfs.namenode.checkpoint.txns</name>   
      <value>1000000</value> 
      <description>操作动作次数</description> 
</property> 
<property> 
      <name>dfs.namenode.checkpoint.check.period</name>   
      <value>60s</value>
      <description> 1 分钟检查一次操作次数</description> 
</property>

相关文章

网友评论

    本文标题:大数据技术之HDFS(五)

    本文链接:https://www.haomeiwen.com/subject/rhxukltx.html