一、为什么需要checkpoint

  • NameNode主要负责集群当中的元数据信息管理,而且元数据信息需要经常随机访问,因此元数据信息必须高效的检索
    • 元数据信息保存再哪里能够快速建索?
    • 如何保证元数据的持久安全?
  • 为了保证元数据信息的快速建索,那么我们就必须将元数据存放在内存中,因为在内存当中的元数据信息能够快速的检索,那么随着元数据信息的增多(每个block块大概占用150字节的元数据信息),内存消耗也会越来越多。
  • 如果所有的元数据信息都存放内存,服务器断电了就会造成内存中的所有数据都会消失,为了保证元数据的安全持久,元数据信息必须做可靠的持久化
  • 在hadoop当中为了持久化存储元数据信息,将所有的元数据信息保存了在FSImage文件当中,那么FSImage随着时间推移,必然越来越膨胀,FSImage的操作越来越难,为了解决元数据信息的增删改,hadoop当中还引入了元数据操作日志edits文件,edits文件记录了客户端操作元数据的信息,随着时间的推移,edits信息也会越来越大,为了解决edits文件膨胀问题,hadoop当中引入了secondaryNameNode来专门做fsimage与edits文件的合并。
  • 首先,checkpoint 之前要先进入安全模式。进入安全模式后,执行saveNamespace命令,他会把a-nn的fsimage 与 大于fsimage txid的editlog(包括finalized 与 in_progress的)合并成新的fsimage并落盘,然后新生成一个editlog。

二、checkpoint过程

namenode工作机制:
1、第一次启动namenode格式化后,创建fsimage和edits文件;如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
2、管理客户端对元数据进行增删改的请求。
3、namenode记录操作日志,更新滚动日志。
4、namenode在内存中对数据进行增删改查。
secondarynamenode工作机制:
1、Secondary Namenode询问namenode是否需要checkpoint,直接带回namenode是否检查结果。
2、Secondary Namenode请求执行checkpoint。
3、namenode滚动正在写的edits日志。
4、将滚动前的编辑日志和镜像拷贝到Secondary Namenode。
5、Secondary Namenode加载编辑日志和镜像日志到内存,进行合并。
6、生成新的镜像文件fsimage.checkpoint。
7、拷贝fsimage.chkpoint到namenode。
8、namenode将fsimage.chkpoint重新命名为fsimage。
image.png
主要参数:

属性 解释
dfs.namenode.checkpoint.period 3600(秒) 两次checkpoint之间的固定时间间隔
dfs.namenode.checkpoint.txns 1000000(次) secondary namenode 检查的事务数量。若检查事务数(操作数)达到这个值,也触发一次checkpoint
dfs.namenode.checkpoint.check.period 60(秒) secondary namenode检查是否满足建立checkpoint的条件的检查周期。默认60,即每1min检查一次。
dfs.namenode.num.checkpoints.retained 在namenode上保存的fsimage的数目,超出的会被删除。默认保存2个
dfs.namenode.num.checkpoints.retained 最多能保存的edits文件个数,默认为1,000,000. 为防止standby namenode宕机导致edits文件堆积的情况,设置的限制。
dfs.ha.tail-edits.period secondary namenode每隔多长时间去检测新的Edits文件。只检测完成了的Edits, 不检测inprogress的文件。default:60s

三、Fsimage和Edits的作用

3.1、概述

fsimage保存了最新的元数据检查点,在HDFS启动时加载fsimage的信息,包含了整个HDFS文件系统的所有目录和文件的信息。
对于文件来说包括了数据块描述信息、修改时间、访问时间等。
对于目录来说包括修改时间、访问权限控制信息(目录所属用户,所在组)等。

editlog主要是在NameNode已经启动情况下对HDFS进行的各种更新操作进行记录,HDFS客户端执行所有的写操作都会首先被记录到editlog中。

seen_txid:记录editlog最后一个数字

Fsimage,editlog主要用于在集群启动时将集群的状态恢复到关闭前的状态。
为了达到这个目的,集群启动时将Fsimage、editlog加载到内存中,进行合并,合并后恢复完成。
20201019195614332.png

3.2、元数据信息目录的配置

  1. <!-- hdfs-site.xml当中 -->
  2. <!-- 1、namenode保存fsimage的配置路径 -->
  3. <property>
  4. <name>dfs.namenode.name.dir</name>
  5. <value>file://hadoop软件包所在路径/HadoopDatas/namenodeDatas</value>
  6. </property>
  7. <!-- 2、namenode保存edits文件的配置路径 -->
  8. <property>
  9. <name>dfs.namenode.edits.dir</name>
  10. <value>file://hadoop软件包所在路径/HadoopDatas/dfs/nn/edits</value>
  11. </property>
  12. <!-- 3、secondaryNamenode保存fsimage文件的配置路径 -->
  13. <property>
  14. <name>dfs.namenode.checkpoint.dir</name>
  15. <value>file:///export/servers/Hadoop-2.6.0-cdh5.14.0/HadoopDatas/dfs/snn/name</value>
  16. </property>
  17. <!-- 4、secondaryNamenode保存edits文件的配置路径 -->
  18. <property>
  19. <name>dfs.namenode.checkpoint.edits.dir</name>
  20. <value>file:///export/servers/Hadoop-2.6.0-cdh5.14.0/HadoopDatas/dfs/nn/snn/edits</value>
  21. </property>

3.3、文件查看

  1. FSimage文件当中的文件信息查看:
  2. 1.将fsimage文件转为xml文件:
  3. hdfs oiv -i fsimage文件绝对路径 -p XML -o hello.xml
  4. 2.查看文件信息
  5. cat hello.xml
  6. <inode>
  7. <id>16386</id>
  8. <type>DIRECTORY</type>
  9. <name>user</name>
  10. <mtime>1512722284477</mtime>
  11. <permission>atguigu:supergroup:rwxr-xr-x</permission>
  12. <nsquota>-1</nsquota>
  13. <dsquota>-1</dsquota>
  14. </inode>
  15. <inode>
  16. <id>16387</id>
  17. <type>DIRECTORY</type>
  18. <name>atguigu</name>
  19. <mtime>1512790549080</mtime>
  20. <permission>atguigu:supergroup:rwxr-xr-x</permission>
  21. <nsquota>-1</nsquota>
  22. <dsquota>-1</dsquota>
  23. </inode>
  24. <inode>
  25. <id>16389</id>
  26. <type>FILE</type>
  27. <name>wc.input</name>
  28. <replication>3</replication>
  29. <mtime>1512722322219</mtime>
  30. <atime>1512722321610</atime>
  31. <perferredBlockSize>134217728</perferredBlockSize>
  32. <permission>atguigu:supergroup:rw-r--r--</permission>
  33. <blocks>
  34. <block>
  35. <id>1073741825</id>
  36. <genstamp>1001</genstamp>
  37. <numBytes>59</numBytes>
  38. </block>
  39. </blocks>
  40. </inode >
  41. -------------------------------------------------------------------------
  42. Edits当中的文件信息查看
  43. 1.将edits文件转为xml文件
  44. hdfs oev -i edits文件绝对路径 -p XML -o myedit.xml
  45. 2.查看文件信息
  46. cat myedit.xml
  47. <?xml version="1.0" encoding="UTF-8"?>
  48. <EDITS>
  49. <EDITS_VERSION>-63</EDITS_VERSION>
  50. <RECORD>
  51. <OPCODE>OP_START_LOG_SEGMENT</OPCODE>
  52. <DATA>
  53. <TXID>129</TXID>
  54. </DATA>
  55. </RECORD>
  56. <RECORD>
  57. <OPCODE>OP_ADD</OPCODE>
  58. <DATA>
  59. <TXID>130</TXID>
  60. <LENGTH>0</LENGTH>
  61. <INODEID>16407</INODEID>
  62. <PATH>/hello7.txt</PATH>
  63. <REPLICATION>2</REPLICATION>
  64. <MTIME>1512943607866</MTIME>
  65. <ATIME>1512943607866</ATIME>
  66. <BLOCKSIZE>134217728</BLOCKSIZE>
  67. <CLIENT_NAME>DFSClient_NONMAPREDUCE_-1544295051_1</CLIENT_NAME>
  68. <CLIENT_MACHINE>192.168.10.102</CLIENT_MACHINE>
  69. <OVERWRITE>true</OVERWRITE>
  70. <PERMISSION_STATUS>
  71. <USERNAME>atguigu</USERNAME>
  72. <GROUPNAME>supergroup</GROUPNAME>
  73. <MODE>420</MODE>
  74. </PERMISSION_STATUS>
  75. <RPC_CLIENTID>908eafd4-9aec-4288-96f1-e8011d181561</RPC_CLIENTID>
  76. <RPC_CALLID>0</RPC_CALLID>
  77. </DATA>
  78. </RECORD>
  79. <RECORD>
  80. <OPCODE>OP_ALLOCATE_BLOCK_ID</OPCODE>
  81. <DATA>
  82. <TXID>131</TXID>
  83. <BLOCK_ID>1073741839</BLOCK_ID>
  84. </DATA>
  85. </RECORD>
  86. <RECORD>
  87. <OPCODE>OP_SET_GENSTAMP_V2</OPCODE>
  88. <DATA>
  89. <TXID>132</TXID>
  90. <GENSTAMPV2>1016</GENSTAMPV2>
  91. </DATA>
  92. </RECORD>
  93. <RECORD>
  94. <OPCODE>OP_ADD_BLOCK</OPCODE>
  95. <DATA>
  96. <TXID>133</TXID>
  97. <PATH>/hello7.txt</PATH>
  98. <BLOCK>
  99. <BLOCK_ID>1073741839</BLOCK_ID>
  100. <NUM_BYTES>0</NUM_BYTES>
  101. <GENSTAMP>1016</GENSTAMP>
  102. </BLOCK>
  103. <RPC_CLIENTID></RPC_CLIENTID>
  104. <RPC_CALLID>-2</RPC_CALLID>
  105. </DATA>
  106. </RECORD>
  107. <RECORD>
  108. <OPCODE>OP_CLOSE</OPCODE>
  109. <DATA>
  110. <TXID>134</TXID>
  111. <LENGTH>0</LENGTH>
  112. <INODEID>0</INODEID>
  113. <PATH>/hello7.txt</PATH>
  114. <REPLICATION>2</REPLICATION>
  115. <MTIME>1512943608761</MTIME>
  116. <ATIME>1512943607866</ATIME>
  117. <BLOCKSIZE>134217728</BLOCKSIZE>
  118. <CLIENT_NAME></CLIENT_NAME>
  119. <CLIENT_MACHINE></CLIENT_MACHINE>
  120. <OVERWRITE>false</OVERWRITE>
  121. <BLOCK>
  122. <BLOCK_ID>1073741839</BLOCK_ID>
  123. <NUM_BYTES>25</NUM_BYTES>
  124. <GENSTAMP>1016</GENSTAMP>
  125. </BLOCK>
  126. <PERMISSION_STATUS>
  127. <USERNAME>atguigu</USERNAME>
  128. <GROUPNAME>supergroup</GROUPNAME>
  129. <MODE>420</MODE>
  130. </PERMISSION_STATUS>
  131. </DATA>
  132. </RECORD>
  133. </EDITS >

3.4、namenode元数据信息多目录配置

目的:为了保证元数据的安全性,我们一般都是先确定好我们的磁盘挂载目录,将元数据的磁盘做RAID1,每个目录存放内容相同,增加了可靠性。

  1. hdfs-site.xml
  2. <property>
  3. <name>dfs.namenode.name.dir</name>
  4. <value>file:///export/servers/Hadoop-2.6.0-cdh5.14.0/HadoopDatas/namenodeDatas,file:///export/servers/Hadoop-2.6.0-cdh5.14.0/HadoopDatas/namenodeDatas,</value>
  5. </property>

四、namenode故障恢复

原理:secondaryNamenode对namenode当中的fsimage和edits进行合并时,每次都会先将namenode的fsimage与edits文件拷贝一份过来,所以fsimage与edits文件在secondarNamendoe当中也会保存有一份,如果namenode的fsimage与edits文件损坏,那么我们可以将secondaryNamenode当中的fsimage与edits拷贝过去给namenode继续使用,只不过有可能会丢失一部分数据。

步骤:
1.杀死namenode进程
2.删除namenode的fsimage与edits文件
3.拷贝secondaryNamenode的fsimage与edits文件到namenode的fsimage与edits文件夹下面去
4.启动namenode
5.浏览器页面正常访问

注:当在Secondaynamenode周期内操作的新操作日志和元数据没有保存在secondaryNamenode中,若在周期外,则代表新数据已经保存在secondaryNamenode中。