首页 > 代码库 > SNN--Second Name Node

SNN--Second Name Node

NameNode有这么几个配置:

Property

Description

Suggested value

dfs.name.dir Directory in NameNode’s local filesystem to store HDFS’s metadata /home/hadoop/dfs/name
dfs.data.dir Directory in a DataNode’s local filesystem to store HDFS’s file blocks /home/hadoop/dfs/data
mapred.system.dir Directory in HDFS for storing shared MapReduce system files /hadoop/mapred/system

dfs.name.dir存放meta信息,dfs.data.dir存放的是文件块信息,它们的默认路径都是/tmp。它们还可以配置多个路径,中间使用逗号进行分割,这样这些路径都会写入相关的数据,从而达到数据备份的目的;如果datanode有多个硬件驱动设备,例如RAID和JBOD这样的,就可以让datanode中不同的硬件去读取dfs.name.dir中不同的目录,从而达到加速IO的效果。

 

NN是HDFS架构中最重要的一个组件。它保存所有文件系统的原信息并以高性能的方式将集群中的块映射图(blockmap)存放在内存中。当有一个微小集群的是,首先应该考虑分配一个机器个NN,其他的DN、JT、TT都不应该运行在上面。应该给NN尽量多的内存,并且使用RAID设备防止单个硬件故障。

一个让nn减负的办法是通过增加块大小去减少文件系统的元数据。文件太大又不利于发挥并行性能,一般块大小在64M到128M之间。一般情况下,NN和SNN是运行在同一台机器上面,SNN将在YARN中被更实时的东西替换,具体看这里:https://issues.apache.org/jira/browse/HADOOP-4539.

 

 Secondary NameNode

 

SNN并非是NN的出现故障时候的一个备份,它周期性的清除NN中的文件系统状态信息,使得NN更有效率。NN使用FsImage和EditLog来管理文件系统的状态信息。文件FsImage是文件系统在某个时间点时候的一个snapshot,而Editlog存放这个时间点后面文件系统增量变化信息。这两个文件联合起来可表示文件系统的当前状态。当初始化NN的时候,他合并两个文件去创建新的snapshot。在NN初始化以后,FsImage将清空Editlog,后继对HDFS的变化将追加到EditLog中,而FsImage的信息将保持不变。NN在内存中保存当前文件系统的状态去快速响应。

集群比较忙的时候,EditLog会变得很大,重启NN时候合并操作会变得非常的慢,这个时候就是SNN大显身手的时候了。它进行合并两个文件的动作(默认是一个小时进行一次),让NN专心负责线上服务, 在文件conf/masters中配置SNN的ip,比较坑爹,因为真正的MASTER是NN。

在conf/hdfs-site.xml file 中通过参数 dfs.http.address加上端口50070确定NN,例如

<property>
    <name>dfs.http.address</name>
    <value>namenode.hadoop-host.com:50070</value>
</property>

SNN 通过这个参数从NN中获取FsImage 和EditLog,拼装后的URL如下:

 

  • FsImage— http://namenode.hadoop-host.com:50070/getimage?getimage=1
  • EditLog— http://namenode.hadoop-host.com:50070/getimage?getedit=1

SNN 同样用这个端口去调用合并后的数据。由于合并计算两个文件是很消耗内存的操作,SNN的硬件配置应当与NN相同。

 

Recovering from a failed NameNode

使用SNN的模式,虽然有切换代价,切换过程中不能够提供服务,但是数据却没有丢失。

NN是整个hadoop系统的单点,虽然SNN不是NN的备份,由于SNN配置与NN类似,故通过一些配置可以使得它作为NN的备用机器。NN的目录dfs.name.dir中存放了文件系统的元信息,SNN并不使用,它将这些信息下载到 fs.checkpoint.dir,然后再找个目录中进行合并操作。

<property>
    <name>dfs.name.dir</name>
    <value>/home/hadoop/dfs/name,/mnt/hadoop-backup</value>
    <final>true</final>
</property>

 假设SNN和NN中dfs.name.dir都是/home/hadoop/dfs/name,而SNN中mount到/mnt/hadoop-backup中,HDFS就会写分别写两份相同的数据到SNN的目录和NN的目录中。这样他们的元数据文件就一模一样了,当出现故障的时候,只要切换ip就能够继续服务。当需要启动备用NN的时候,将NN的IP切换到备用NN的IP,由于DNS中已经缓存了DNS表,所以修改hostname是无效的。还需要在备用NN上面运行bin/start-dfs.sh

 

hadoop的HA还在做的过程中,据说YARN可以完美解决。

 

通过checkpoint image 恢复可以在这里找到http://issues.apache.org/jira/browse/HADOOP-2585.

HA的RDBD解决方案 http://www.cloudera.com/blog/2009/07/22/hadoop-ha-configuration/.