一、为什么需要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。
主要参数:
| 属性 | 值 | 解释 |
|---|---|---|
| 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加载到内存中,进行合并,合并后恢复完成。
3.2、元数据信息目录的配置
<!-- hdfs-site.xml当中 --><!-- 1、namenode保存fsimage的配置路径 --><property><name>dfs.namenode.name.dir</name><value>file://hadoop软件包所在路径/HadoopDatas/namenodeDatas</value></property><!-- 2、namenode保存edits文件的配置路径 --><property><name>dfs.namenode.edits.dir</name><value>file://hadoop软件包所在路径/HadoopDatas/dfs/nn/edits</value></property><!-- 3、secondaryNamenode保存fsimage文件的配置路径 --><property><name>dfs.namenode.checkpoint.dir</name><value>file:///export/servers/Hadoop-2.6.0-cdh5.14.0/HadoopDatas/dfs/snn/name</value></property><!-- 4、secondaryNamenode保存edits文件的配置路径 --><property><name>dfs.namenode.checkpoint.edits.dir</name><value>file:///export/servers/Hadoop-2.6.0-cdh5.14.0/HadoopDatas/dfs/nn/snn/edits</value></property>
3.3、文件查看
FSimage文件当中的文件信息查看:1.将fsimage文件转为xml文件:hdfs oiv -i fsimage文件绝对路径 -p XML -o hello.xml2.查看文件信息cat hello.xml<inode><id>16386</id><type>DIRECTORY</type><name>user</name><mtime>1512722284477</mtime><permission>atguigu:supergroup:rwxr-xr-x</permission><nsquota>-1</nsquota><dsquota>-1</dsquota></inode><inode><id>16387</id><type>DIRECTORY</type><name>atguigu</name><mtime>1512790549080</mtime><permission>atguigu: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>atguigu:supergroup:rw-r--r--</permission><blocks><block><id>1073741825</id><genstamp>1001</genstamp><numBytes>59</numBytes></block></blocks></inode >-------------------------------------------------------------------------Edits当中的文件信息查看1.将edits文件转为xml文件hdfs oev -i edits文件绝对路径 -p XML -o myedit.xml2.查看文件信息cat myedit.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>atguigu</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>atguigu</USERNAME><GROUPNAME>supergroup</GROUPNAME><MODE>420</MODE></PERMISSION_STATUS></DATA></RECORD></EDITS >
3.4、namenode元数据信息多目录配置
目的:为了保证元数据的安全性,我们一般都是先确定好我们的磁盘挂载目录,将元数据的磁盘做RAID1,每个目录存放内容相同,增加了可靠性。
hdfs-site.xml<property><name>dfs.namenode.name.dir</name><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></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中。
