经验文档,写了很久了,现在贴出来吧,慢慢积累。

1.  机器配置

   

NO.

资产编号

IP

主机名

配置

1

 

192.168.42.20

server1

CPU:双核Pentium(R) Dual-Core  CPU      E5400  @ 2.70GHz

内存:4G

Swap:4G

磁盘:150G

 

2

 

192.168.42.21

server2

CPU:双核Pentium(R) Dual-Core  CPU      E5700  @ 3.00GHz

内存:2G

Swap:2G

磁盘:250G

3

 

192.168.42.22

server3

 

CPU:双核Pentium(R) Dual-Core  CPU      E5700  @ 3.00GHz

内存:2G

Swap:2G

磁盘:250G

 

4

 

192.168.42.23

server4

CPU:双核Pentium(R) Dual-Core  CPU      E5400  @ 2.70GHz

内存:4G

Swap:4G

磁盘:300G

 

注:

查看CPU:cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

查看内存:free –m

查看磁盘:df  -m

处理器信息:dmidecode | grep -A48 'Processor Information$'

 

 

2.  网络拓扑:

安装版本:hadoop-0.20.2

 

hadoop 修复块 hadoop维护_云计算

角色:

主机名

Hadoop角色

Hadoop jps命令结果

Hadoop用户

Hadoop目录

server1

Master

 

NameNode

TaskTracker

SecondaryNameNode

创建相同的用户的组名:hadoop。

安装hadoop-0.20.2时使用hadoop用户,并且hadoop的文件夹归属也是hadoop:hadoop

安装目录:/opt/hadoop

 

数据存储目录:

/hadoop

server2

slave

DataNode

TaskTracker

server3

slave

DataNode

TaskTracker

server4

slave

DataNode

TaskTracker

 

/etc/hosts文件配置

127.0.0.1       localhost

192.168.42.20   server1

192.168.42.21   server2

192.168.42.22   server3

192.168.42.23   server4

 

 

3.  动态移除节点

这里的节点节点包括datanode和tasktracker。一般来说,退出datanode也会把tasktracker也退出的。但按照配置,似乎可以只退出一个节点的datanode或tasktracker。这里同时将server2退出,解除其作为集群的datanode和tasktracker。

 

退出前,不要往将要退出的节点上写数据。

以下的文件修改、命令操作都是在master上进行。

 

3.1修改配置文件

 

需要在配置文件添加排除节点的属性配置。

 

编辑conf/hdfs-site.xml文件,增加如下配置:

<property>

          <name>dfs.hosts.exclude</name>

          <value>/opt/hadoop_conf/exclude_node</value>

</property>

/opt/hadoop_conf/exclude_node指定需要退出的节点名。

 

如果同时要退出tasktracker,编辑conf/mapred-site.xml文件,增加如下配置:

<property>
<property>
          <name>mapred.hosts.exclude</name>
          <value>/opt/hadoop_conf/exclude_node</value>
</property>

/opt/hadoop_conf/exclude_node指定需要退出的节点名。

 

注意,这里datanode和tasktracker的排除文件指向同一文件,实际上可以分开。

 

要把server2节点退出hadoop集群,编辑exclude_node文件内容,增加需要退出的节点:

server2

 

 

3.2执行命令

hadoop dfsadmin -refreshNodes

该命令没有反应……

 

运行中的状态是:Decommissionin progress……

 

查看命令结果,命令行:

hadoop dfsadmin –report
 
#####下面是命令的一部分结果######
Name: 192.168.42.21:50010
Decommission Status : Decommission in progress
Configured Capacity: 243999055872 (227.24 GB)
DFS Used: 387870720 (369.9 MB)
Non DFS Used: 16118525952 (15.01 GB)
DFS Remaining: 227492659200(211.87 GB)
DFS Used%: 0.16%
DFS Remaining%: 93.24%
Last contact: Tue Nov 01 15:18:14 CST 2011

 

从网页中查看:

 

hadoop 修复块 hadoop维护_hadoop_02

 

等待直到结束后,命令行的状态变为:Decommission Status: Normal

查看网页时,只剩下server3和server4这两个节点,server2退出,并且:

Live Nodes  : 2

Dead Nodes  : 1

 

 

3.3移除配置

从slaves文件中移除节点:

即将被移除的主机名从slaves文件中删除。

 

从conf/hdfs-site.xml和conf/mapred-site.xml先前添加的排除节点参数设置。或者从/opt/hadoop_conf/exclude_node中移除节点名。

 

3.4手动停掉tasktracker

在移除集群的server2是查看hadoop进程,发现tasktracker还运行着^.^!!!。经多方查找,也没有方法,只有手动停止。官方说在hadoop-0.20.2这个版本没有可以刷新jobtracker的命令。

 

找到tasktracker的PID,然后杀死:

hadoop@server2:~$ jps
25987 TaskTracker
16515 Jps
hadoop@server2:~$ ps -ef|grep 25987
hadoop@server2:~$ kill -9 25987

 

 

另一种方法是重启MapReduce集群。作为权宜之计,可以将mapred.jobtracker.restart.recover属性设为true,使用jobtracker能够在重启之后恢复正在运行的作业。――《hadoop权威指南》

 

3.5测试

 

 

4.  动态增加节点

4.1 增加server2节点

这里又把server2加入的hadoop集群。

 

在新的节点上(这里是server2),因为是刚刚从hadoop集群退出来的,其配置等环境已经OK了,那就可以直接在新节点启动datanode和jobtracker了:

hadoop@server2:~$ hadoop-daemon.sh start datanode
hadoop@server2:~$ hadoop-daemon.sh start tasktracker

 

然后打开http://server1:50070/查看,新节点server2已经添加进来了。

 

保持新节点与master节点的环境一致是最简单的了,这里回顾一下关键点:

ü  /etc/hosts文件一致

ü  Java,hadoop环境变量一致

ü  Hadoop的配置文件一致

ü  Master节点中在slaves文件中添加新节点名

 

最后考虑是否要运行均衡器。需要用户手动运行命令:

start-balancer.sh

 

 

4.2 控制可接入的节点

一台新节点是很容易加入集群的,如果随便都可以加入,那是非常危险的。所以还可以进行允许哪些节点加入集群的控制。

 

需要在配置文件添加允许节点的属性配置。

 

编辑conf/hdfs-site.xml文件,增加如下配置:

<property>
          <name>dfs.hosts </name>
          <value>/opt/hadoop_conf/include_node</value>
</property>

/opt/hadoop_conf/include_node指定允许加入的节点名。

 

编辑conf/mapred-site.xml文件,增加如下配置:

<property>
          <name>mapred.hosts </name>
          <value>/opt/hadoop_conf/include_node</value>
</property>

/opt/hadoop_conf/include_node指定允许加入的节点名。

 

编辑include_node文件内容,添加允许连接的节点:

server2
server3
server4

 

使用命令使配置生效:

hadoop dfsadmin -refreshNodes

 

在新节点上(这里是server2)运行命令:

hadoop@server2:~$ hadoop-daemon.sh start datanode
hadoop@server2:~$ hadoop-daemon.sh start tasktracker

 

但经过检测,只能够控制datanode的连接,tasktracker还是控制不了。

 

5.  namenode的备份与恢复

5.1namenode的备份策略

要点:

ü  设置保存namenode的冗余路径。

在hdfs-site.xml文件里属性dfs.name.dir里,逗号分隔路径:

<property>
<name>dfs.name.dir</name>
<value>/hadoop/dfs/name,/mnt/nfs_name</value>
</property>

 

然后重启或进行格式化,两个路径下的文件都一样。冗余路径可以初始化前或运行过程中添加。

 

ü  将SecondaryNameNode放在另一台机器上运行。

conf/master配置文件指定运行SecondaryNameNode的机器。

 

ü  手动创建永久检查点。

#先进入安全模式
hadoop dfsadmin
hadoop dfsadmin  -saveNamespace
hadoop dfsadmin

 

ü  自动创建永久检查点。

fs.checkpoint.period:单位秒,默认值3600,检查点的间隔时间,当距离上次检查点执行超过该时间后启动检查点

fs.checkpoint.size:单位字节,默认值67108864,当edits文件超过该大小后,启动检查点上面两个条件是或的关系,主要满足启动一个条件,检查点即被唤醒

 

 

5.2namenode的恢复

假设运行nodenode的节点server1突然宕机了,现在要从平时备份的文件中恢复。

ü  从冗余备份中恢复

1)准备一台运行namenode的机器,可能从datanode或SecondaryNameNode或备份的地方拷贝一份hadoop到新机器,各环境变量,参数配置相同,SSH连接没有问题。

2)将冗余的name目录中复制到新机器的name目录。如从/mnt/nfs_name下的所有文件复制到/hadoop/dfs/name目录下。(实践中发现不进行复制也可以,只要/mnt/nfs_name下有冗余的,hadoop启动后自动复制到/hadoop/dfs/name)

3)启动namenode和jobtracker服务。此时只有master节点宕掉了,slaves还在运行,所以只需要在新的master节点启动namenode和jobtracker服务也是可以的。不过一般都是先停止集群再重新启动,jobtracker死了以后,tasktraker也跟着死了,免得还要每个节点启动tasktraker。

#下面是在server2上启用新的master,secondarynamenode是在其它节点上
#不停止集群,只启动namenode和jobtracker 
hadoop@server2:~$ hadoop-daemon.sh start  namenode
hadoop@server2:~$ hadoop-daemon.sh start  jobtracker
 
#先停止后启动
hadoop@server2:~$ stop-all.sh
hadoop@server2:~$ start-all.sh
 
#或者需要启动secondarynamenode和tasktracker
hadoop1@server1:~$ hadoop-daemon.sh start secondarynamenode
hadoop1@server1:~$ hadoop-daemon.sh start tasktracker

       

       一般namenode有冗余备份,数据容易恢复,也不容易丢失,风险小。

 

ü  从SecondaryNameNode检查点文件中恢复

假设作为namenode的server1宕掉,namesecondary存放在server2中。准备一台新机器做为server1。

恢复时namesecondary的文件要放在namenode同一台机器上,如果namenode和namesecondary分开放,要先进行拷贝,首先确认namesecondary存放位置(fs.checkpoint.dir),然后从server2拷贝到server1:

scp -r /hadoop/dfs/namesecondary/* server1:/hadoop1/dfs/namesecondary/

 

在master的dfs.name.dir上新建一个文件夹name,恢复时name下是空的。然后执行:

hadoop namenode –importCheckpoint
#这是前台执行命令,建议转入后台
hadoop namenode –importCheckpoint &

 

使用hadoop fsck /命令检查文件Block的完整性,可以看到损坏的文件列表。

同时查看安全模式hadoop dfsadmin -safemode get。如果有损坏的文件,会一直运行在安全模式下,此时只有退出安全模式:hadoop dfsadmin –safemode leave。

删除或者移除损坏的文件:

  

hadoop fsck / -delete   #删除损坏的文件
hadoop fsck / -move    #把损坏的文件移到/lost+found

 

停止hadoop集群:stop-all.sh

 

删除(或先备份)namesecondary目录下的文件(新加master节点及server2中的namesecondary)。

 

然后然后重新启动。不过重新启动之前,应用先考虑是否对namenode节点进行冗余处理,即配置dfs.name.dir,增加冗余存放路径。

 

最后手动生成永久检查点:

#先进行安全模式,停止写入内容到edit
hadoop dfsadmin
hadoop dfsadmin  -saveNamespace
hadoop dfsadmin

 

 

5.3 

6.  待继。。。