一、为什么需要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.xml
2.查看文件信息
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.xml
2.查看文件信息
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中。