由于之前远程桌面不好使,集群出现了missing block的时候没法登陆远程桌面查看是那些节点由于重启导致DataNode进程挂掉。同时简单的用命令hdfs dfsadmin -report查看又不方便,信息量太多,以下是一个用sed和awk实现的简单的脚本:
cat lastDeadNodes.sh
hdfs dfsadmin -report > all.log
#sed -n ‘/Dead/,$p‘ all.log > deadnodes.log
sed ‘1,/Dead/d‘ all.log > deadnodes.log
sed -i /Rack/d deadnodes.log
awk ‘BEGIN{RS="\n\n\n";ORS="\n";FS="\n";OFS="\t"}{print $2,$15}‘ deadnodes.log > last.log
dt=`date`
dt=`echo $dt | awk -F" " ‘{print $2" "$3}‘`
grep "$dt" last.log
脚本说明之前说明以下hdfs dfsadmin -report获取到的数据的格式:
.......
Name: 10.39.0.185:50010 (10.39.0.185)
Hostname: 10.39.0.185
Rack: /YH11070028
Decommission Status : Normal
Configured Capacity: 46607198593024 (42.39 TB)
DFS Used: 22027374755910 (20.03 TB)
Non DFS Used: 0 (0 B)
DFS Remaining: 24579823837114 (22.36 TB)
DFS Used%: 47.26%
DFS Remaining%: 52.74%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Last contact: Wed Feb 25 23:14:43 CST 2015
Dead datanodes:
Name: 10.39.1.35:50010 (10.39.1.35)
Hostname: 10.39.1.35
Rack: /YH11070032
Decommission Status : Normal
Configured Capacity: 0 (0 B)
DFS Used: 0 (0 B)
Non DFS Used: 0 (0 B)
DFS Remaining: 0 (0 B)
DFS Used%: 100.00%
DFS Remaining%: 0.00%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Last contact: Mon Jan 26 10:08:36 CST 2015
.......
从以上信息看出在hadoop2.0中挂掉的DN节点信息在“Dead datanodes:“行之后,所以写脚本的关键就是从这一行开始获取后面的所有行的信息。
以下是对脚本的说明:
1、通过hdfs dfsadmin -report命令拿到集群所以DN的信息输出到all.log文件,包括存活的和挂掉DN信息。
2、获取挂掉的DN节点信息,通过sed来实现
#sed -n ‘/Dead/,$p‘ all.log > deadnodes.log #这种方式拿到的信息会包含匹配行“Dead datanodes:”
sed ‘1,/Dead/d‘ all.log > deadnodes.log #这种方式拿到的信息是从匹配行“Dead datanodes:”的下一行至末尾的信息,剔除了匹配行
3、完成第二步之后我们就拿到了所有的挂掉的DN信息,但是经过测试发现有的DN信息里面没有”Rack: “这一行的信息,这一行也不是我们最后需要的,索性就删掉:
sed -i /Rack/d deadnodes.log
4、完成第三步之后的信息格式如下:
Name: 10.39.1.35:50010 (10.39.1.35)
Hostname: 10.39.1.35
Decommission Status : Normal
Configured Capacity: 0 (0 B)
DFS Used: 0 (0 B)
Non DFS Used: 0 (0 B)
DFS Remaining: 0 (0 B)
DFS Used%: 100.00%
DFS Remaining%: 0.00%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Last contact: Mon Jan 26 10:08:36 CST 2015
Name: 10.39.6.197:50010 (10.39.6.197)
Hostname: 10.39.6.197
Decommission Status : Normal
Configured Capacity: 0 (0 B)
DFS Used: 0 (0 B)
Non DFS Used: 0 (0 B)
DFS Remaining: 0 (0 B)
DFS Used%: 100.00%
DFS Remaining%: 0.00%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Last contact: Mon Jan 19 18:23:56 CST 2015
其实我们值需要的信息是Hostname和Last contact,这一步用awk来实现,将多行作为一个记录来处理:
awk ‘BEGIN{RS="\n\n\n";ORS="\n";FS="\n";OFS="\t"}{print $2,$15}‘ deadnodes.log > last.log
这里面用到了awk的几个关键字:RS/ORS/FS/OFS
RS:Record Separator,记录分隔符
ORS:Output Record Separate,输出当前记录分隔符
FS:Field Separator,字段分隔符
OFS:Out of Field Separator,输出字段分隔符
awk脚本的意思是以三个换行符"\n\n\n"为处理记录的分隔符(RS="\n\n\n"),既从“Name:”到“Last contact: ”,awk作为一个记录来处理,处理完的记录之间用一个换行符隔开(ORS="\n"),待处理的一个记录的字段之间的分隔符为一个换行符(FS="\n"),但是处理完之后一个记录的字段之间的分隔符我们用的是\t(OFS="\t"),每一个记录里面我们只关注Hostname和Last contact,所以只需要打印$2和$15({print
$2,$15})。
可以看以下经过这一步处理之后的数据格式:
Hostname: 10.39.1.35Last contact: Mon Jan 26 10:08:36 CST 2015
Hostname: 10.39.6.197 Last contact: Mon Jan 19 18:23:56 CST 2015
Hostname: 10.39.5.80 Last contact: Sat Feb 07 03:59:20 CST 2015
Hostname: 10.39.4.247 Last contact: Wed Feb 25 17:27:51 CST 2015
Hostname: 10.39.6.199 Last contact: Mon Feb 02 10:42:21 CST 2015
Hostname: 10.39.7.55 Last contact: Thu Feb 26 00:26:17 CST 2015
Hostname: 10.39.0.218 Last contact: Thu Feb 12 07:18:54 CST 2015
Hostname: 10.39.0.208 Last contact: Mon Feb 09 12:22:13 CST 2015
Hostname: 10.39.4.235 Last contact: Thu Jan 01 08:00:00 CST 1970
Hostname: 10.39.4.243 Last contact: Thu Jan 01 08:00:00 CST 1970
5、最后我们只关注今天挂掉的DN节点
dt=`date`
dt=`echo $dt | awk -F" " ‘{print $2" "$3}‘`
grep "$dt" last.log
结果:
Hostname: 10.39.7.55Last contact: Thu Feb 26 00:26:17 CST 2015
小结:
这个脚本用到了awk和sed的一些特殊用法,在此记录一下以后便于查询。