文档章节

hadoop Secondary NameNode作用

吕猛
 吕猛
发布于 2015/09/19 00:00
字数 2047
阅读 330
收藏 0

光从字面上来理解,很容易让一些初学者先入为主的认为:SecondaryNameNode(snn)就是NameNode(nn)的热备进程。其 实不是。snn是HDFS架构中的一个组成部分,但是经常由于名字而被人误解它真正的用途,其实它真正的用途,是用来保存namenode中对HDFS metadata的信息的备份,并减少namenode重启的时间。对于hadoop进程中 ,要配置好并正确的使用 snn,还是需要做一些工作的。 hadoop的默认配置中让 snn进程默认运行在了 namenode 的那台机器上,但是这样的话,如果这台机器出错,宕机,对恢复HDFS文件系统是很大的灾难,更好的方式是:将snn的进程配置在另外一台机器 上运行。

在hadoop中,namenode负责对HDFS的metadata的持久化存储,并且处理来自客户端的对HDFS的各种操作的交互反馈。为了保 证交互速度,HDFS文件系统的metadata是被load到namenode机器的内存中的,并且会将内存中的这些数据保存到磁盘进行持久化存储。为 了保证这个持久化过程不会成为HDFS操作的瓶颈,hadoop采取的方式是:没有对任何一次的当前文件系统的snapshot进行持久化,对HDFS最 近一段时间的操作list会被保存到namenode中的一个叫Editlog的文件中去。当重启namenode时,除了 load fsImage意外,还会对这个EditLog文件中 记录的HDFS操作进行replay,以恢复HDFS重启之前的最终状态。

而SecondaryNameNode,会周期性的将EditLog中记录的对HDFS的操作合并到一个checkpoint中,然后清空 EditLog。所以namenode的重启就会Load最新的一个checkpoint,并replay EditLog中 记录的hdfs操作,由于EditLog中记录的是从 上一次checkpoint以后到现在的操作列表,所以就会比较小。如果没有snn的这个周期性的合并过程,那么当每次重启namenode的时候,就会 花费很长的时间。而这样周期性的合并就能减少重启的时间。同时也能保证HDFS系统的完整性。

这就是SecondaryNameNode所做的事情。所以snn并不能分担namenode上对HDFS交互性操作的压力。尽管如此,当 namenode机器宕机或者namenode进程出问题时,namenode的daemon进程可以通过人工的方式从snn上拷贝一份metadata 来恢复HDFS文件系统。

至于为什么要将SNN进程运行在一台非NameNode的 机器上,这主要出于两点考虑:

  • 可扩展性: 创建一个新的HDFS的snapshot需要将namenode中load到内存的metadata信息全部拷贝一遍,这样的操作需要的内存就需要 和namenode占用的内存一样,由于分配给namenode进程的内存其实是对HDFS文件系统的限制,如果分布式文件系统非常的大,那么 namenode那台机器的内存就可能会被namenode进程全部占据。

  • 容错性: 当snn创建一个checkpoint的时候,它会将checkpoint拷贝成metadata的几个拷贝。将这个操作运行到另外一台机器,还可以提供分布式文件系统的容错性。

配置将SecondaryNameNode运行在另外一台机器上

HDFS的一次运行实例是通过在namenode机器上的$HADOOP_HOME/bin/start-dfs.sh( 或者start-all.sh ) 脚本来启动的。这个脚本会在运行该脚本的机器上启动 namenode进程,而slaves机器上都会启动DataNode进程,slave机器的列表保存在 conf/slaves文件中,一行一台机器。并且会在另外一台机器上启动一个snn进程,这台机器由 conf/masters文件指定。所以,这里需要严格注意, conf/masters 文件中指定的机器,并不是说jobtracker或者namenode进程要 运行在这台机器上,因为这些进程是运行在 launch bin/start-dfs.sh或者 bin/start-mapred.sh(start-all.sh)的机器上的。所以,masters这个文件名是非常的令人混淆的,应该叫做 secondaries会比较合适。然后,通过以下步骤:


  1. 将所有想要运行secondarynamenode进程的机器写到masters文件中,一行一台。

  2. 修改在masters文件中配置了的机器上的conf/hadoop-site.xml文件,加上如下选项:

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

  core-site.xml:这里有2个参数可配置,但一般来说我们不做修改。fs.checkpoint.period表示多长时间记录一次hdfs的镜像。默认是1小时。fs.checkpoint.size表示一次记录多大的size,默认64M。

<property>  
  <name>fs.checkpoint.period</name>  
  <value>3600</value>  
  <description>The number of seconds between two periodic checkpoints.  
  </description>  
</property>  
  
<property>  
  <name>fs.checkpoint.size</name>  
  <value>67108864</value>  
  <description>The size of the current edit log (in bytes) that triggers  
       a periodic checkpoint even if the fs.checkpoint.period hasn't expired.  
  </description>  
</property>
 
<property> 
    <name>fs.checkpoint.dir</name> 
    <value>/data/work/hdfs/namesecondary</value> 
    <description>Determines where on the local filesystem the DFS secondary name node should store the temporary images to merge. If this is a comma-delimited list of directories then the image is replicated in all of the directories for redundancy. </description> 
</property>

3、配置检查。配置完成之后,我们需要检查一下是否成功。我们可以通过查看运行secondarynamenode的机器上文件目录来确定是否成功 配置。首先输入jps查看是否存在secondarynamenode进程。如果存在,在查看对应的目录下是否有备份记录。该目录一般存在于hadoop.tmp.dir/dfs/namesecondary/下面。

四、恢复

制造namenode宕机的情况
1) kill 掉namenode的进程

[root@master name]# jps 
11749 NameNode 
12339 Jps 
11905 JobTracker 
[root@master name]# kill 11749

2)删除dfs.name.dir所指向的文件夹,这里是/data/work/hdfs/name

[root@master name]# rm -rf *

删除name目录下的所有内容,但是必须保证name这个目录是存在的

3)从secondarynamenode远程拷贝namesecondary文件到namenode的namesecondary

[root@master hdfs]# scp -r slave-001:/data/work/hdfs/namesecondary/ ./

4)启动namenode

[root@master /data]# hadoop namenode –importCheckpoint

正常启动以后,屏幕上会显示很多log,这个时候namenode就可以正常访问了

5)检查

使用hadoop fsck /user命令检查文件Block的完整性

hadoop fsck /

6)停止namenode,使用crrl+C或者会话结束

7)删除namesecondary目录下的文件(保存干净)

[root@master namesecondary]# rm -rf *

8)正式启动namenode

[root@master bin]# ./hadoop-daemon.sh start  namenode

恢复工作完成,检查hdfs的数据

9)balancer

在使用start-balancer.sh时, 默认使用1M/S(1048576)的速度移动数据(so slowly...)
修改hdfs-site.xml配置,这里我们使用的是20m/S

<property> 
<name>dfs.balance.bandwidthPerSec</name> 
<value>20971520</value> 
<description> Specifies the maximum bandwidth that each datanode can utilize for the balancing purpose in term of the number of bytes per second. </description> 
</property>

然后结果是导致job运行变得不稳定,出现一些意外的长map单元,某些reduce时间处理变长(整个集群负载满满的情况下,外加20m/s的balance),据说淘宝的为10m/s,需要调整后实验,看看情况如何。

hadoop balancer -threshold 5

五、总结

1、secondarynamenode可以配置多个,master文件里面多写几个就可以。

2、千万记得如果要恢复数据是需要手动拷贝到namenode机器上的。不是自动的(参看上面写的恢复操作)。

3、镜像备份的周期时间是可以修改的,如果不想一个小时备份一次,可以改的时间短点。core-site.xml中的fs.checkpoint.period值


本文转载自:http://www.cnblogs.com/ggjucheng/archive/2012/04/18/2454693.html

吕猛
粉丝 5
博文 8
码字总数 1173
作品 0
南京
高级程序员
私信 提问
Secondary NameNode:它究竟有什么作用?

 前言 最近刚接触Hadoop, 一直没有弄明白NameNode和Secondary NameNode的区别和关系。很多人都认为,Secondary NameNode是NameNode的备份,是为了防止NameNode的单点失败的,直到读了这篇...

u013388996
2018/03/09
0
0
Secondary NameNode:它究竟有什么作用?(转自:http://blog.csdn.net/xh16319/article/details/31375197)

前言 最近刚接触Hadoop, 一直没有弄明白NameNode和Secondary NameNode的区别和关系。很多人都认为,Secondary NameNode是NameNode的备份,是为了防止NameNode的单点失败的,直到读了这篇文章...

涂作权
2017/05/27
0
0
hadoop中NameNode、DataNode、Secondary、NameNode、JobTracker TaskTracker介绍

http://www.aboutyun.com/thread-7778-1-1.html 问题导读: 1.job的本质是什么? 2.任务的本质是什么? 3.文件系统的Namespace由谁来管理,Namespace的作用是什么? 4.Namespace 镜像文件(Na...

chenkechao
2016/11/23
29
0
hadoop_NameNode的介绍

NameNode的作用: 管理着文件系统的命名空间。它维护着文件系统数以及文件树中所有的文件和目录。这些信息以两个文件形式永久保存在本地磁盘中(这两个文件也会被持久化存储在本地硬盘),分...

天行自息
2018/11/01
20
0
hadoop主节点(NameNode)备份策略以及恢复方法

link:http://jiajun.iteye.com/blog/809125 一、dits和fsimage 首先要提到两个文件edits和fsimage,下面来说说他们是做什么的。 集群中的名称节点(NameNode)会把文件系统的变化以追加保存到...

长征2号
2017/08/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

射频 - 灵敏度

灵敏度是一个规格指示器,显示设备接收信号的程度,并在“令人满意的错误率”内对其进行解码。 (“令人满意的错误率”的错误率应该有多低,通常由每个应用自己的规范定义)。灵敏度以功率电...

demyar
26分钟前
5
0
java @Contract 的pom坐标

应用 @Contract(value = "_ -> param1", pure = true) int getNum(int i){ return i;} pom <dependency> <groupId>org.jetbrains</groupId> ......

macker
29分钟前
5
0
git 拉取指定分支

//默认(xxx指的是url)git clone xxx//指定分支(xxx指的是url)git clone -b 分支名 xxx

uug
36分钟前
6
0
阿里云报SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed:根本原因

报错内容如下: 系统架构如下: 15台阿里云服务器集群(主服放在华南可用区A区,其他14台分别部署在A/B/C/D/E区都有) + 1台阿里云Reids(A区) + 5台阿里云mysql服务器(1主4从)(A区) 报错请况: 这个...

银装素裹
39分钟前
6
0
Android Handler理解

Handler是什么 Handler是Android 线程间通信工具类。 一般用于子线程向主线程发送消息,将子线程中执行结果通知主线程,从而在主线程中执行UI更新操作。 源码角度理解 Handler负责发送(sen...

二营长的意大利炮手
45分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部