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

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



从这里说明,假如你的数据块损坏了,假如你只有一个备份,你是不能恢复的。下面是模拟namenode宕机,数据块损坏实践。


在恢复的过程中,


1.通过什么方式来模拟宕机的?


2.都需要做哪些工作?


3.修改那些配置文件?


4.数据恢复的过程是什么?



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





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.  <property>
2.  <name>hadoop.mydata.dir</name>
3.  <value>/data/zhouhh/myhadoop</value>
4.  <description>A base for other directories.${user.name} </description>
5.  </property>
6.  
7.  <property>
8.  <name>hadoop.tmp.dir</name>
9.  <value>/tmp/hadoop-${user.name}</value>
10.  <description>A base for other temporary directories.</description>
11.  </property>
12.  
13.  <property>
14.  <name>fs.checkpoint.dir</name>
15.  <value>${hadoop.data.dir}/dfs/namesecondary</value>
16.  <description>Determines where on the local filesystem the DFS secondary
17.  name node should store the temporary images to merge.
18.  If this is a comma-delimited list of directories then the image is
19.  replicated in all of the directories for redundancy.
20.  </description>
21.  </property>
22.  
23.  <property>
24.  <name>fs.checkpoint.edits.dir</name>
25.  <value>${fs.checkpoint.dir}</value>
26.  <description>Determines where on the local filesystem the DFS secondary
27.  name node should store the temporary edits to merge.
28.  If this is a comma-delimited list of directoires then teh edits is
29.  replicated in all of the directoires for redundancy.
30.  Default value is same as fs.checkpoint.dir
31.  </description>
32.  </property>
33.  <property>
34.  <name>fs.checkpoint.period</name>
35.  <value>20</value>
36.  <description>The number of seconds between two periodic checkpoints.default is 3600 second
37.  </description>
38.  </property>
39.  
40.  <property>
41.  <name>fs.checkpoint.size</name>
42.  <value>67108864</value>
43.  <description>The size of the current edit log (in bytes) that triggers
44.  a periodic checkpoint even if the fs.checkpoint.period hasn’t expired.
45.  </description>
46.  </property>

复制代码


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.  <property>
2.  <name>dfs.name.dir</name>
3.  <value>${hadoop.mydata.dir}/dfs/name</value>
4.  <description>Determines where on the local filesystem the DFS name node
5.  should store the name table(fsimage). If this is a comma-delimited list
6.  of directories then the name table is replicated in all of the
7.  directories, for redundancy.
8.  Default value is:${hadoop.tmp.dir}/dfs/name
9.  </description>
10.  </property>
11.  <property>
12.  <name>dfs.secondary.http.address</name>
13.  <value>Hadoop47:55090</value>
14.  <description>
15.  The secondary namenode http server address and port.
16.  If the port is 0 then the server will start on a free port.
17.  </description>
18.  </property>


复制代码





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.  
2.  [zhouhh@Hadoop47 ~]$ jps
3.  23157 DataNode
4.  23362 TaskTracker
5.  23460 Jps
6.  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.  
2.  [zhouhh@Hadoop48 hadoop-1.0.3]$ cat test中文.txt
3.  这是测试文件
4.  test001 by zhouhh
5.  
6.  http://abloz.com

7.  
8.  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.  
3.  Found 2 items
4.  
5.  -rw-r–r– 2 zhouhh supergroup 1381 2012-09-26 14:03 /user/zhouhh/README.txt
6.  
7.  -rw-r–r– 2 zhouhh supergroup 65 2012-09-26 14:10 /user/zhouhh/test中文.txt
8.  
9.  [zhouhh@Hadoop48 ~]$ hadoop fs -cat test中文.txt
10.  这是测试文件
11.  test001 by zhouhh
12.  http://abloz.com

13.  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.  
    2.  [zhouhh@Hadoop48 ~]$ jps
    3.  9633 Bootstrap
    4.  23019 Jps
    5.  19867 JobTracker


    复制代码



    1.  
    2.  [zhouhh@Hadoop47 hadoop-1.0.3]$ jps
    3.  1716 DataNode
    4.  3825 Jps
    5.  1935 TaskTracker
    6.  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 ..
    2.

    复制代码


    采用改名的方式进行测试


    [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.  
    5.  [zhouhh@Hadoop48 dfs]$ ls
    6.  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.  
    2.  [zhouhh@Hadoop48 dfs]$ hadoop fs -ls .
    3.  Found 2 items
    4.  -rw-r–r– 2 zhouhh supergroup 1381 2012-09-26 14:03 /user/zhouhh/README.txt
    5.  -rw-r–r– 2 zhouhh supergroup 65 2012-09-26 14:10 /user/zhouhh/test中文.txt


    复制代码



    1.  
    2.  [zhouhh@Hadoop48 dfs]$ hadoop fs -cat test中文.txt
    3.  这是测试文件
    4.  test001 by zhouhh
    5.  
    6.  http://abloz.com
    
    7.  
    8.  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


    复制代码


    恢复成功