vlambda博客
学习文章列表

2.监控hdfs使用情况和启用定时任务

前言

前面一片文章描写了怎么用go去监控hdfs的文件夹大小,这篇文章将为大家带来怎么监控hdfs使用情况和定时任务功能

hdfs磁盘空间监控

这个是每天定时发送一次,所以这次结合定时任务一起说了。下图就是个大概情况,当使用百分比超过80就会出现橘黄色,超过90%就会出现深红色。

图1:钉钉告警

实现思路

通过执行下面命令获取hdfs集群的信息,然后对这些信息进行格式化处理。

hdfs dfsadmin -report | grep -E '^Name|DFS|Configured Capacity'

输出结果如下图:

图2:HDFS使用情况

1.由于前4行是集群的信息,不是dn节点的信息,所以我们需要判断下2.将输出结果格式化成我们需要的格式(markdown)3.每个dn节点信息占7行,我这里用了模运算,即%7 当余数等于0,1,2,4,5分别对应了 节点名,总空间,已用空间,可用空间,百分比4.需要利用正则将每行括号里面的信息提取出来5.格式化后通过钉钉发送到报警群就可以了。

格式化函数


// 提取每行中被小括号括住的信息var rgx = regexp.MustCompile(`\((.*?)\)`)// s即hdfs dfsadmin -report | grep -E '^Name|DFS|Configured Capacity' 的输出func FormatDiskInfo(s string) string { l := strings.Split(s, "\n") rs := "## hdfs集群状况\n\n" for i, r := range l { // 提取每行中被小括号括住的信息 _s := rgx.FindStringSubmatch(r) if r == "" { continue } if i < 4 { switch i { case 0: rs += "- 总空间: " + _s[1] + "\n" case 1: rs += "- 可用空间:" + _s[1] + "\n" case 2: rs += "- 已用空间:" + _s[1] + "\n" case 3: __s := strings.Split(r, " ") rs += "- 已用百分比:" + DiskNotice(__s[2]) + "\n\n" } } else { switch (i - 4) % 7 { case 0: rs += "## " + _s[1] + "状态\n\n" case 1: rs += "- 总空间: " + _s[1] + "\n" case 4: rs += "- 可用空间:" + _s[1] + "\n" case 2: rs += "- 已用空间:" + _s[1] + "\n" case 5: __s := strings.Split(r, " ") rs += "- 已用百分比:" + DiskNotice(__s[2]) + "\n\n" } } } return rs}

定时任务

本来也是可以用系统的定时任务,但是由于咱们这毕竟是一个程序,而不是一个小脚本,一旦监控项越来越多,使用系统的crond修改起来也不方便,所以就直接在程序里面启动一个定时任务来维护。

实现思路

1.我们通过一个变量来控制是否启用了定时任务2.在配置监控项的时候需要加上在那个时间段去执行

监控有第三方的包,不需要我们自己再辛苦的去实现了。

go get -u github.com/robfig/cron"

go代码部分

if enable_task { log.Println("启用定时任务") // 循环遍历任务加到定时任务里面 crond := cron.New() for n, t := range config.Tasks { t.Ding = &ding switch t.Module { case "hdfs": if t.Crond != "" { log.Println("添加定时任务:", n, "时间:", t.Crond) crond.AddJob(t.Crond, hadoop.Hdfs{Name: n, Task: t}) } default: log.Println("没有对应的模块") } } crond.Start() http.Handle("/metrics", promhttp.Handler()) log.Fatal(http.ListenAndServe(":19957", nil)) defer crond.Stop() }

配置文件

xian: dingding: dingding-token tasks: v_report:  module: hdfs type: CompareSize args: /user/hive/warehouse/zcsy.db/v_report/ptdate={{.Yesterday}} gt 20282905455 crond: 00 00 09 * * * desc: 西安{{.Yesterday}} v_report状态

在9点时候去执行hdfs模块的CompareSize方法