分享

hadoop HA 中的standby namenode问题

kanwei163 发表于 2015-1-5 09:36:28 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 4 13055
Hadoop HA中的standby nn是有定期对JN上日志进行合并成fsimage,并同步给Active NN的作用吧?

如果有,这个时间间隔是多少?哪个配置项?

已有(4)人评论

跳转到指定楼层
langke93 发表于 2015-1-5 11:48:44

时间间隔可以通过下面配置:

hdfs-site.xml以下两个属性的值得到:
  1. <property>
  2. <name>dfs.namenode.checkpoint.period</name>
  3. <value>3600</value>
  4. <description>The number of seconds between two periodic checkpoints.
  5. </description>
  6. </property>
复制代码


  1. <property>
  2. <name>dfs.namenode.checkpoint.check.period</name>
  3. <value>60</value>
  4. <description>The SecondaryNameNode and CheckpointNode will poll the NameNode
  5. every 'dfs.namenode.checkpoint.check.period' seconds to query the number
  6. of uncheckpointed transactions.
  7. </description>
  8. </property>
复制代码




更多参考内容:

Standby NN的状态和Active NN保持同步,即元数据保持一致,它们都将会和JournalNodes守护进程通信。当Active NN执行任何有关命名空间的修改,它需要持久化到一半以上的JournalNodes上(通过edits log持久化存储),而Standby NN负责观察edits log的变化,它能够读取从JNs中读取edits信息,并更新其内部的命名空间。一旦Active NN出现故障,Standby NN将会保证从JNs中读出了全部的Edits,然后切换成Active状态。Standby NN读取全部的edits可确保发生故障转移之前,是和Active NN拥有完全同步的命名空间状态

这种机制是如何实现fsimage和edits的合并?在standby NameNode节点上会一直运行一个叫做CheckpointerThread的线程,这个线程调用StandbyCheckpointer类的doWork()函数,而doWork函数会每隔Math.min(checkpointCheckPeriod, checkpointPeriod)秒来坐一次合并操作,相关代码如下:

  1. try {
  2. Thread.sleep(1000 * checkpointConf.getCheckPeriod());
  3. } catch (InterruptedException ie) {
  4. }
  5. public long getCheckPeriod() {
  6. return Math.min(checkpointCheckPeriod, checkpointPeriod);
  7. }
  8. checkpointCheckPeriod = conf.getLong(
  9. DFS_NAMENODE_CHECKPOINT_CHECK_PERIOD_KEY,
  10. DFS_NAMENODE_CHECKPOINT_CHECK_PERIOD_DEFAULT);
  11. checkpointPeriod = conf.getLong(DFS_NAMENODE_CHECKPOINT_PERIOD_KEY,
  12. DFS_NAMENODE_CHECKPOINT_PERIOD_DEFAULT);
复制代码



上面的checkpointCheckPeriod和checkpointPeriod变量是通过获取hdfs-site.xml以下两个属性的值得到:
  1. <property>
  2. <name>dfs.namenode.checkpoint.period</name>
  3. <value>3600</value>
  4. <description>The number of seconds between two periodic checkpoints.
  5. </description>
  6. </property>
复制代码


  1. <property>
  2. <name>dfs.namenode.checkpoint.check.period</name>
  3. <value>60</value>
  4. <description>The SecondaryNameNode and CheckpointNode will poll the NameNode
  5. every 'dfs.namenode.checkpoint.check.period' seconds to query the number
  6. of uncheckpointed transactions.
  7. </description>
  8. </property>
复制代码




当达到下面两个条件的情况下,将会执行一次checkpoint:


  1. boolean needCheckpoint = false;
  2. if (uncheckpointed >= checkpointConf.getTxnCount()) {
  3. LOG.info("Triggering checkpoint because there have been " +
  4. uncheckpointed + " txns since the last checkpoint, which " +
  5. "exceeds the configured threshold " +
  6. checkpointConf.getTxnCount());
  7. needCheckpoint = true;
  8. } else if (secsSinceLast >= checkpointConf.getPeriod()) {
  9. LOG.info("Triggering checkpoint because it has been " +
  10. secsSinceLast + " seconds since the last checkpoint, which " +
  11. "exceeds the configured interval " + checkpointConf.getPeriod());
  12. needCheckpoint = true;
  13. }
复制代码




 当上述needCheckpoint被设置成true的时候,StandbyCheckpointer类的doWork()函数将会调用doCheckpoint()函数正式处理checkpoint。当fsimage和edits的合并完成之后,它将会把合并后的fsimage上传到Active NameNode节点上,Active NameNode节点下载完合并后的fsimage,再将旧的fsimage删掉(Active NameNode上的)同时清除旧的edits文件。步骤可以归类如下:
  (1)、配置好HA后,客户端所有的更新操作将会写到JournalNodes节点的共享目录中,可以通过下面配置

  1. <property>
  2.   <name>dfs.namenode.shared.edits.dir</name>
  3.   <value>qjournal://XXXX/mycluster</value>
  4. </property>
  5. <property>
  6.   <name>dfs.journalnode.edits.dir</name>
  7.   <value>/export1/hadoop2x/dfs/journal</value>
  8. </property>
复制代码




 (2)、Active Namenode和Standby NameNode从JournalNodes的edits共享目录中同步edits到自己edits目录中;
  (3)、Standby NameNode中的StandbyCheckpointer类会定期的检查合并的条件是否成立,如果成立会合并fsimage和edits文件;
  (4)、Standby NameNode中的StandbyCheckpointer类合并完之后,将合并之后的fsimage上传到Active NameNode相应目录中;
  (5)、Active NameNode接到最新的fsimage文件之后,将旧的fsimage和edits文件清理掉;
  (6)、通过上面的几步,fsimage和edits文件就完成了合并,由于HA机制,会使得Standby NameNode和Active NameNode都拥有最新的fsimage和edits文件(之前Hadoop 1.x的SecondaryNameNode中的fsimage和edits不是最新的)



来自:

Hadoop 2.x中fsimage和edits合并源码分析及配置等说明




回复

使用道具 举报

kanwei163 发表于 2015-1-5 12:19:36
langke93 发表于 2015-1-5 11:48
时间间隔可以通过下面配置:

hdfs-site.xml以下两个属性的值得到:

非常感谢回答
回复

使用道具 举报

kanwei163 发表于 2015-1-5 13:35:17
langke93 发表于 2015-1-5 11:48
时间间隔可以通过下面配置:

hdfs-site.xml以下两个属性的值得到:

还有个问题要问下:


Standby NN负责观察edits log的变化,它能够读取从JNs中读取edits信息,并更新其内部的命名空间。


从JNs中读取日志后,会改变自己的inprogress标记吗?


如果不改变,那么已经读取日志文件,如果在failover的时候,不重复读取?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条