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
<property>
<name>hadoop.mydata.dir</name>
<value>/data/zhouhh/myhadoop</value>
<description>A base for other directories.${user.name} </description>
</property>

<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop-${user.name}</value>
<description>A base for other temporary directories.</description>
</property>

<property>
<name>fs.checkpoint.dir</name>
<value>${hadoop.data.dir}/dfs/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>

<property>
<name>fs.checkpoint.edits.dir</name>
<value>${fs.checkpoint.dir}</value>
<description>Determines where on the local filesystem the DFS secondary
name node should store the temporary edits to merge.
If this is a comma-delimited list of directoires then teh edits is
replicated in all of the directoires for redundancy.
Default value is same as fs.checkpoint.dir
</description>
</property>
<property>
<name>fs.checkpoint.period</name>
<value>20</value>
<description>The number of seconds between two periodic checkpoints.default is 3600 second
</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>

2.将second namenode设置到另一台机器。
设置masters文件,这是指定seconde namenode启动的机器。
[zhouhh@Hadoop48 conf]$ cat masters
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
<property>
<name>dfs.name.dir</name>
<value>${hadoop.mydata.dir}/dfs/name</value>
<description>Determines where on the local filesystem the DFS name node
should store the name table(fsimage). If this is a comma-delimited list
of directories then the name table is replicated in all of the
directories, for redundancy.
Default value is:${hadoop.tmp.dir}/dfs/name
</description>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>Hadoop47:55090</value>
<description>
The secondary namenode http server address and port.
If the port is 0 then the server will start on a free port.
</description>
</property>

3.测试时如果name node指定的目录没有初始化,需初始化一下
[zhouhh@Hadoop48 logs]$ hadoop namenode -format

4.同步conf下的配置到Hadoop47/46(略),启动hadoop
[zhouhh@Hadoop48 conf]$ start-all.sh

[zhouhh@Hadoop48 conf]$ jps
9633 Bootstrap
10746 JobTracker
10572 NameNode
10840 Jps

[zhouhh@Hadoop47 ~]$ jps
23157 DataNode
23362 TaskTracker
23460 Jps
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.编辑放置测试文件
[zhouhh@Hadoop48 hadoop-1.0.3]$ fs -put README.txt /user/zhouhh/README.txt
[zhouhh@Hadoop48 hadoop-1.0.3]$ fs -ls .
Found 1 items
-rw-r–r– 2 zhouhh supergroup 1381 2012-09-26 14:03 /user/zhouhh/README.txt
[zhouhh@Hadoop48 hadoop-1.0.3]$ cat test中文.txt
这是测试文件
test001 by zhouhh

http://abloz.com

2012.9.26

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

[zhouhh@Hadoop48 hadoop-1.0.3]$ hadoop fs -ls .
Found 2 items
-rw-r–r– 2 zhouhh supergroup 1381 2012-09-26 14:03 /user/zhouhh/README.txt
-rw-r–r– 2 zhouhh supergroup 65 2012-09-26 14:10 /user/zhouhh/test中文.txt
[zhouhh@Hadoop48 ~]$ hadoop fs -cat test中文.txt
这是测试文件
test001 by zhouhh

http://abloz.com

2012.9.26

7 杀死Namenode,模拟崩溃
[zhouhh@Hadoop48 ~]$ jps
9633 Bootstrap
23006 Jps
19691 NameNode
19867 JobTracker
[zhouhh@Hadoop48 ~]$ kill -9 19691
[zhouhh@Hadoop48 ~]$ jps
9633 Bootstrap
23019 Jps
19867 JobTracker

[zhouhh@Hadoop47 hadoop-1.0.3]$ jps
1716 DataNode
3825 Jps
1935 TaskTracker
1824 SecondaryNameNode

8. 将dfs.name.dir下的内容清空,模拟硬盘损坏
[zhouhh@Hadoop48 ~]$ cd /data/zhouhh/myhadoop/dfs/name/
[zhouhh@Hadoop48 name]$ ls
current image in_use.lock previous.checkpoint
[zhouhh@Hadoop48 name]$ cd ..
采用改名的方式进行测试
[zhouhh@Hadoop48 dfs]$ mv name name1
此时,name 目录不存在,namenode是会启动失败的

9.数据恢复,从second namenode 复制数据

查看second namenode文件,并打包复制到namenode的fs.checkpoint.dir
[zhouhh@Hadoop47 hadoop-1.0.3]$ cd /data/zhouhh/myhadoop/dfs/
[zhouhh@Hadoop47 dfs]$ ls
data namesecondary
[zhouhh@Hadoop47 dfs]$ cd namesecondary/
[zhouhh@Hadoop47 namesecondary]$ ls
current image in_use.lock
[zhouhh@Hadoop47 namesecondary]$ cd ..
[zhouhh@Hadoop47 dfs]$ scp sec.tar.gz Hadoop48:/data/zhouhh/myhadoop/dfs/
sec.tar.gz

[zhouhh@Hadoop48 dfs]$ ls
name1 sec.tar.gz
[zhouhh@Hadoop48 dfs]$ tar zxvf sec.tar.gz
namesecondary/
namesecondary/current/
namesecondary/current/VERSION
namesecondary/current/fsimage
namesecondary/current/edits
namesecondary/current/fstime
namesecondary/image/
namesecondary/image/fsimage
namesecondary/in_use.lock
[zhouhh@Hadoop48 dfs]$ ls
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.恢复成功,检查数据正确性
[zhouhh@Hadoop48 dfs]$ start-all.sh
[zhouhh@Hadoop48 dfs]$ jps
23940 Jps
9633 Bootstrap
19867 JobTracker
23791 NameNode
[zhouhh@Hadoop48 dfs]$ hadoop fs -ls .
Found 2 items
-rw-r–r– 2 zhouhh supergroup 1381 2012-09-26 14:03 /user/zhouhh/README.txt
-rw-r–r– 2 zhouhh supergroup 65 2012-09-26 14:10 /user/zhouhh/test中文.txt
[zhouhh@Hadoop48 dfs]$ hadoop fs -cat test中文.txt
这是测试文件
test001 by zhouhh

http://abloz.com

2012.9.26

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

恢复成功

原文地址:http://abloz.com/2012/09/26/the-namenode-collapse-data-recovery-test.html

<think>嗯,用户现在又遇到了Hadoop的警告信息,关于NameNode的存储目录配置问题。之前他们处理过端口无法启动的问题,现在可能是在启动HDFS之后遇到了新的警告。首先,我需要确定这些警告的具体含义和影响。 用户提供的日志中有两个警告:一个是关于`dfs.namenode.name.dir`只配置了一个目录,另一个是`dfs.namenode.edits.dir`也只配置了一个目录。这两个警告都是在提醒用户没有配置冗余存储目录,可能存在数据丢失的风险。Hadoop推荐在生产环境中配置多个目录,通常在不同的磁盘或文件系统上,以实现高可用性。 接下来,我需要考虑用户为什么会遇到这个问题。可能的情况是他们在配置HDFS时,只设置了一个存储目录,而没有配置多个。这可能是因为用户是在测试环境中搭建Hadoop,或者是按照某个简化教程进行配置,没有注意到生产环境的建议。 接下来需要告诉用户如何解决这个问题。首先需要检查当前的配置,看看`hdfs-site.xml`中的相关参数是否只设置了一个路径。然后,指导用户如何添加多个目录,用逗号分隔。同时,要提醒用户修改配置后需要重新启动HDFS服务,并且如果之前已经有数据的话,可能需要重新格式化NameNode,但这会导致数据丢失,所以需要谨慎处理。 另外,用户可能是在测试环境中,可能并不需要高可用性,这时候可以建议用户忽略这些警告,但需要明确说明这样做的风险。同时,用户可能需要了解Hadoop的存储机制,比如FsImage和EditLog的作用,以及为什么冗余存储目录对数据安全很重要。 还需要考虑用户的实际环境。如果用户是初次接触Hadoop,可能需要更详细的步骤说明,比如如何编辑配置文件,如何正确设置多个目录路径,以及如何验证配置是否生效。同时,可能需要提醒用户关于文件系统的权限问题,确保所有配置的目录都有正确的读写权限,避免因为权限问题导致服务启动失败。 另外,用户之前处理过端口问题,可能对Hadoop的配置和日志查看有一定的了解,可以适当使用技术术语,但需要保持解释清晰易懂。比如,解释FsImage是元数据的快照,EditLog记录操作日志,冗余存储可以防止单点故障导致的数据丢失。 最后,应该总结解决方案,分步骤给出操作建议,并强调生产环境和测试环境的不同处理方式,确保用户能根据自身情况选择合适的解决方法。</think>以下是关于HDFS存储目录警告的详细分析和解决方案: --- ### 一、警告解析 #### 1. **核心警告内容**: ``` WARN Only one image storage directory (dfs.namenode.name.dir) configured WARN Only one namespace edits storage directory (dfs.namenode.edits.dir) configured ``` - **触发条件**:当`fsimage`(元数据镜像)或`edits`(操作日志)的存储路径仅配置单个目录时 - **风险提示**:单点故障可能导致元数据永久丢失 #### 2. **核心概念说明**: | 组件 | 作用 | 存储内容示例 | |------------|-------------------------------|-----------------------| | fsimage | NameNode数据的完整快照 | 文件块映射表 | | edits | 记录HDFS写操作的增量日志 | 创建/删除文件操作记录 | --- ### 二、问题定位 通过`hdfs-site.xml`配置验证: ```xml <!-- 错误配置示例(单路径) --> <property> <name>dfs.namenode.name.dir</name> <value>/data/hadoop/namenode</value> </property> <property> <name>dfs.namenode.edits.dir</name> <value>/data/hadoop/edits</value> </property> ``` --- ### 三、解决方案 #### **方案1:生产环境高可用配置**(推荐) ```xml <!-- 修改hdfs-site.xml --> <property> <name>dfs.namenode.name.dir</name> <value>file:///data1/namenode,file:///data2/namenode</value> </property> <property> <name>dfs.namenode.edits.dir</name> <value>file:///data1/edits,file:///data2/edits</value> </property> ``` **操作要求**: 1. 保证多个存储路径位于**不同物理磁盘** 2. 所有目录需预先创建并设置相同权限 3. 执行元数据同步: ```bash hdfs namenode -initializeSharedEdits ``` #### **方案2:测试环境临时处理** 在`hdfs-site.xml`中添加容错配置: ```xml <property> <name>dfs.client.failover.proxy.provider</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> ``` --- ### 四、操作验证流程 ```mermaid graph TD A[修改配置文件] --> B[同步元数据] B --> C[重启HDFS] C --> D{检查警告是否消除} D -->|是| E[完成] D -->|否| F[检查目录权限] F --> G[验证多路径可访问性] G --> C ``` --- ### 五、补充说明 1. **关键参数对比**: | 参数名称 | 默认值 | 安全配置要求 | |---------------------------|----------------------|----------------------| | dfs.namenode.name.dir | file://${hadoop.tmp.dir}/dfs/name | ≥2个独立存储介质 | | dfs.namenode.edits.dir | ${dfs.namenode.name.dir} | 建议与name.dir分离 | 2. **物理存储建议**: - 使用RAID1/RAID10磁盘阵列 - 至少保留一个异地备份(如AWS S3) - 定期执行`hdfs dfsadmin -fetchImage`手动备份 --- ### 六、风险提示 若持续使用单目录配置,可能引发: - **元数据**:磁盘故障导致集群不可恢复 - **服务中断**:单点故障触发NameNode崩溃 - **数据不一致**:EditLog丢失造成操作记录断层 建议通过`hdfs dfsadmin -metasave`命令定期监控元数据状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值