目前手里面有四套大数据集群的作业需要维护,分别属于不同的客户,我同岗位的兄弟离职后,所有的数据作业都落到我头上了,公司也不招人了。开发新的数据作业倒没有什么问题,就是客户叫我补数的时候,头比较大,当天的直接重跑就是了,尤其是要补很久以前的数据,还要去查看代码,找出作业之间的依赖。调度平台也不尽相同。如果能提前发现问题,当天问题当天解决,客户不找我补数,那不是有更多的时间摸鱼啦?
1.需要监控的组件盘点
针对Apache 原生部署的集群,重点监控对象 hdfs yarn ,挂的概率最大就是这两大组件,然后就是kafka、 zookeeper、Azkaban,这三个组件的监控比较简单,主要监听程序端口是否开启。针对cdh集群设置组件故障重启,利用cdh数据库监听集群组件状态。所有集群监听yarn上运行的作业。监控程序语言选择java,之前用python写过一些简单的监控程序,但是部署实在是很麻烦。
2.Hdfs 监控
主要是监控 namenode 、datanode 以及hdfs使用情况。 这里主要是用hadoop的api实现的。
public static String hdfsCheck() throws IOException{
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://xxxxx:9820"); // Namenode 地址和端口
// 创建 HdfsAdmin 实例
DistributedFileSystem dfs;
try {
dfs = (DistributedFileSystem) FileSystem.get(conf);
dfs.getServerDefaults().getReplication();
}catch (Exception e){
conf.set("fs.defaultFS", "hdfs://XXXX:9820"); // HA Namenode 地址和端口
dfs = (DistributedFileSystem) FileSystem.get(conf);
}
String warn = "";
try {
// 创建 HDFS 文件系统实例
if (dfs.isInSafeMode()) {
warn = "namenode is in safe mode";
}
long totalCapacity = dfs.getStatus().getCapacity(); // 总容量
long usedCapacity = dfs.getStatus().getUsed(); // 已用容量
long remainingCapacity = dfs.getStatus().getRemaining(); // 可用容量
double usagePercentage = (double) usedCapacity / totalCapacity * 100;
// 将字节转换为吉字节
double totalCapacityGB = totalCapacity / (1024.0 * 1024 * 1024);
double usedCapacityGB = usedCapacity / (1024.0 * 1024 * 1024);
double remainingCapacityGB = remainingCapacity / (1024.0 * 1024 * 1024);
// 输出容量信息
log.info(String.format("Total Capacity: %.2f GB", totalCapacityGB));
log.info(String.format("Used Capacity: %.2f GB", usedCapacityGB));
log.info(String.format("Remaining Capacity: %.2f GB", remainingCapacityGB));
log.info(String.format("Usage Percentage: %.2f%%", usagePercentage));
// 检查使用率是否超过 90%
if (usagePercentage > 90) {
warn=warn+"Warning: HDFS usage exceeds 90%!";
}
// 检查使用率是否超过