模拟namenode宕机:数据块损坏,该如何修复

from:http://www.aboutyun.com/thread-7437-1-1.html
(出处: about云开发)

数据块损坏,有很多同学想修复,但是不知道方法,首先我们看下面一段话:


有了block,提供数据容错和可用性的冗余备份(replication)机制可以更好的工作。在HDFS中,为了防止数据块损坏,或者磁盘及机器当机,每一个block在不同机器上都有几份备份(默认为3)。如果一个block不能用了,HDFS会以一种对用户透明的方式拷贝一份新的备份出来,从而把集群的数据安全级别恢复到以前的水平(你也可以通过提高冗余备份数来提高数据的安全级别)。

从这里说明,假如你的数据块损坏了,假如你只有一个备份,你是不能恢复的。下面是模拟namenode宕机,数据块损坏实践。
在恢复的过程中,
1.通过什么方式来模拟宕机的?
2.都需要做哪些工作?
3.修改那些配置文件?
4.数据恢复的过程是什么?





namenode崩溃的数据恢复测试



前言
用second namenode 数据恢复测试。datanode由于采用2-3个备份,即使一台设备损坏,还是能自动恢复并找回全部数据。
hadoop 1.0.3和0.20之前的版本,namenode存在单点问题。如果namenode损坏,会导致整个系统数据彻底丢失。所以second namenode就显得特别重要。本文主要探讨namenode损坏的数据恢复实践,包括配置文件,部署,namenode崩溃,namenode数据损坏和namenode meta数据恢复。
hadoop版本是hadoop1.0.3
一共三台机器参与测试。
机器角色:
Hadoop48 Namenode
Hadoop47 Second Namenode, Datanode
Hadoop46 Datanode

1.编辑core-site,增加checkpoint相关配置
fs.checkpoint.dir 是恢复文件存放目录
fs.checkpoint.period 同步检查时间,缺省是3600秒1小时。测试时设为20秒。
fs.checkpoint.size 当edit 日志文件大于这个字节数时,即使检查时间没到,也会触发同步。
[zhouhh@Hadoop48 conf]$ vi core-site.xml

  1. hadoop.mydata.dir
  2. /data/zhouhh/myhadoop
  3. A base for other directories.${user.name}



  4. hadoop.tmp.dir
  5. /tmp/hadoop-${user.name}
  6. A base for other temporary directories.



  7. fs.checkpoint.dir
  8. ${hadoop.data.dir}/dfs/namesecondary
  9. Determines where on the local filesystem the DFS secondary
  10. name node should store the temporary images to merge.
  11. If this is a comma-delimited list of directories then the image is
  12. replicated in all of the directories for redundancy.




  13. fs.checkpoint.edits.dir
  14. ${fs.checkpoint.dir}
  15. Determines where on the local filesystem the DFS secondary
  16. name node should store the temporary edits to merge.
  17. If this is a comma-delimited list of directoires then teh edits is
  18. replicated in all of the directoires for redundancy.
  19. Default value is same as fs.checkpoint.dir



  20. fs.checkpoint.period
  21. 20
  22. The number of seconds between two periodic checkpoints.default is 3600 second




  23. fs.checkpoint.size
  24. 67108864
  25. The size of the current edit log (in bytes) that triggers
  26. a periodic checkpoint even if the fs.checkpoint.period hasn’t expired.

复制代码

2.将second namenode设置到另一台机器。
设置masters文件,这是指定seconde namenode启动的机器。
  1. [zhouhh@Hadoop48 conf]$ cat masters
  2. Hadoop47
复制代码


编辑dfs.secondary.http.address,指定second namenode的http web UI 域名或IP到namenode Hadoop48不同的机器Hadoop47,而不是缺省的0.0.0.0
[zhouhh@Hadoop48 conf]$ vi hdfs-site.xml

  1. dfs.name.dir
  2. ${hadoop.mydata.dir}/dfs/name
  3. Determines where on the local filesystem the DFS name node
  4. should store the name table(fsimage). If this is a comma-delimited list
  5. of directories then the name table is replicated in all of the
  6. directories, for redundancy.
  7. Default value is:${hadoop.tmp.dir}/dfs/name



  8. dfs.secondary.http.address
  9. Hadoop47:55090

  10. The secondary namenode http server address and port.
  11. If the port is 0 then the server will start on a free port.

复制代码


3.测试时如果name node指定的目录没有初始化,需初始化一下
[zhouhh@Hadoop48 logs]$ hadoop namenode -format
4.同步conf下的配置到Hadoop47/46(略),启动hadoop
  1. [zhouhh@Hadoop48 conf]$ start-all.sh
复制代码


  1. [zhouhh@Hadoop48 conf]$ jps
  2. 9633 Bootstrap
  3. 10746 JobTracker
  4. 10572 NameNode
  5. 10840 Jps
复制代码


  1. [zhouhh@Hadoop47 ~]$ jps
  2. 23157 DataNode
  3. 23362 TaskTracker
  4. 23460 Jps
  5. 23250 SecondaryNameNode
复制代码


Namenode log报的error:
2012-09-25 19:27:54,816 ERROR security.UserGroupInformation – PriviledgedActionException as:zhouhh cause:org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot delete /data/zhouhh/myhadoop/mapred/ system. Name node is in safe mode.

请不要急,NameNode会在开始启动阶段自动关闭安全模式,然后启动成功。如果你不想等待,可以运行:
bin/hadoop dfsadmin -safemode leave 强制结束。
NameNode启动时会从fsimage和edits日志文件中装载文件系统的状态信息,接着它等待各个DataNode向它报告它们各自的数据块状态,这样,NameNode就不会过早地开始复制数据块,即使在副本充足的情况下。这个阶段,NameNode处于安全模式下。NameNode的安全模式本质上是HDFS集群的一种只读模式,此时集群不允许任何对文件系统或者数据块修改的操作。通常NameNode会在开始阶段自动地退出安全模式。如果需要,你也可以通过’bin/hadoop dfsadmin -safemode’命令显式地将HDFS置于安全模式。NameNode首页会显示当前是否处于安全模式。
5.编辑放置测试文件
  1. [zhouhh@Hadoop48 hadoop-1.0.3]$ fs -put README.txt /user/zhouhh/README.txt
复制代码

  1. [zhouhh@Hadoop48 hadoop-1.0.3]$ fs -ls .
  2. Found 1 items
  3. -rw-r–r– 2 zhouhh supergroup 1381 2012-09-26 14:03 /user/zhouhh/README.txt
复制代码


  1. [zhouhh@Hadoop48 hadoop-1.0.3]$ cat test中文.txt
  2. 这是测试文件
  3. test001 by zhouhh

  4. http://abloz.com

  5. 2012.9.26
复制代码


6. 放到HDFS中
  1. [zhouhh@Hadoop48 hadoop-1.0.3]$ hadoop fs -put test中文.txt .
复制代码

  1. [zhouhh@Hadoop48 hadoop-1.0.3]$ hadoop fs -ls .

  2. Found 2 items

  3. -rw-r–r– 2 zhouhh supergroup 1381 2012-09-26 14:03 /user/zhouhh/README.txt

  4. -rw-r–r– 2 zhouhh supergroup 65 2012-09-26 14:10 /user/zhouhh/test中文.txt

  5. [zhouhh@Hadoop48 ~]$ hadoop fs -cat test中文.txt
  6. 这是测试文件
  7. test001 by zhouhh
  8. http://abloz.com
  9. 2012.9.26
复制代码


7 杀死Namenode,模拟崩溃
  1. [zhouhh@Hadoop48 ~]$ jps
  2. 9633 Bootstrap
  3. 23006 Jps
  4. 19691 NameNode
  5. 19867 JobTracker
复制代码

  1. [zhouhh@Hadoop48 ~]$ kill -9 19691
复制代码

  1. [zhouhh@Hadoop48 ~]$ jps
  2. 9633 Bootstrap
  3. 23019 Jps
  4. 19867 JobTracker
复制代码


  1. [zhouhh@Hadoop47 hadoop-1.0.3]$ jps
  2. 1716 DataNode
  3. 3825 Jps
  4. 1935 TaskTracker
  5. 1824 SecondaryNameNode
复制代码

8. 将dfs.name.dir下的内容清空,模拟硬盘损坏
  1. [zhouhh@Hadoop48 ~]$ cd /data/zhouhh/myhadoop/dfs/name/
复制代码

  1. [zhouhh@Hadoop48 name]$ ls
  2. current image in_use.lock previous.checkpoint
复制代码

  1. [zhouhh@Hadoop48 name]$ cd ..

复制代码

采用改名的方式进行测试
[zhouhh@Hadoop48 dfs]$ mv name name1
此时,name 目录不存在,namenode是会启动失败的
9.数据恢复,从second namenode 复制数据
查看second namenode文件,并打包复制到namenode的fs.checkpoint.dir
  1. [zhouhh@Hadoop47 hadoop-1.0.3]$ cd /data/zhouhh/myhadoop/dfs/
  2. [zhouhh@Hadoop47 dfs]$ ls
  3. data namesecondary
复制代码

  1. [zhouhh@Hadoop47 dfs]$ cd namesecondary/
  2. [zhouhh@Hadoop47 namesecondary]$ ls
  3. current image in_use.lock
复制代码

  1. [zhouhh@Hadoop47 namesecondary]$ cd ..
  2. [zhouhh@Hadoop47 dfs]$ scp sec.tar.gz Hadoop48:/data/zhouhh/myhadoop/dfs/
  3. sec.tar.gz

  4. [zhouhh@Hadoop48 dfs]$ ls
  5. name1 sec.tar.gz
复制代码

  1. [zhouhh@Hadoop48 dfs]$ tar zxvf sec.tar.gz
  2. namesecondary/
  3. namesecondary/current/
  4. namesecondary/current/VERSION
  5. namesecondary/current/fsimage
  6. namesecondary/current/edits
  7. namesecondary/current/fstime
  8. namesecondary/image/
  9. namesecondary/image/fsimage
  10. namesecondary/in_use.lock
  11. [zhouhh@Hadoop48 dfs]$ ls
  12. name1 namesecondary sec.tar.gz
复制代码

如果dfs.name.dir配置的name不存在,需创建name目录(我测试时将其改名了,也可以进入name目录用rm * -f)
[zhouhh@Hadoop48 dfs]$ mkdir name
[zhouhh@Hadoop48 dfs]$ hadoop namenode -importCheckpoint
此时name下面已经有数据
Ctrl+C 结束
10.恢复成功,检查数据正确性
  1. [zhouhh@Hadoop48 dfs]$ start-all.sh
  2. [zhouhh@Hadoop48 dfs]$ jps
  3. 23940 Jps
  4. 9633 Bootstrap
  5. 19867 JobTracker
  6. 23791 NameNode
复制代码

  1. [zhouhh@Hadoop48 dfs]$ hadoop fs -ls .
  2. Found 2 items
  3. -rw-r–r– 2 zhouhh supergroup 1381 2012-09-26 14:03 /user/zhouhh/README.txt
  4. -rw-r–r– 2 zhouhh supergroup 65 2012-09-26 14:10 /user/zhouhh/test中文.txt
复制代码


  1. [zhouhh@Hadoop48 dfs]$ hadoop fs -cat test中文.txt
  2. 这是测试文件
  3. test001 by zhouhh

  4. http://abloz.com

  5. 2012.9.26
复制代码


  1. [zhouhh@Hadoop48 dfs]$ hadoop fsck /user/zhouhh
  2. FSCK started by zhouhh from /192.168.10.48 for path /user/zhouhh at Wed Sep 26 14:42:31 CST 2012
  3. ..Status: HEALTHY
复制代码

恢复成功

你可能感兴趣的:(Hadoop)