大数据技术之HDFS(五)

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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容