1 场景前提
当前的需求是:我们要统计日志服务器的文件的行数
再统计上传到hdfs的文件的行数
比对以下有没有少数据
问题:日志服务器和hdfs集群不在同一个机器上,shell脚本没有办法同时获取两台机器的信息
触类旁通:我们有时会需要将数据进行一个统计并汇总,需要想一个办法将不同机器上的数据统计在一起的需求。
解决方案:公司可以开发一个web监控系统,【信息总线系统工程】
2 spring boot 编程
写一个url来让日志服务器提交源文件的行数
/commite/api
再写一个url来让hdfs服务器获取到日志服务器中的源文件的行数,进行比对
/api/get
3 脚本
日志服务器的脚本
#!/bin/bash
#获取日期
dt=$(date -d'-1 day' +%Y-%m-%d)
#
cnt=$(wc -l /root/moni_data/log/applog/*.${dt} | cut -d' ' -f 1)
servername=$(hostname)
curl -H "Content-type: application/json" -X POST -d"{\"logServerName\":\"${servername}\",\"logType\":\"applog\",\"logDate\":\"${dt}\",\"lineCnt\":${cnt} }" http://192.168.5.3:8080/api/commit
hdfs集群的脚本
============================================数据测试=====================================================
# NR表示行数 如果是第一行就跳过,到下一行,然后打印所有行最后一个元素 $NF表示取最后一个元素的值
awk 'NR==1{next}{print $NF}'
cnt=0
for f in $(hdfs dfs -ls /log/applog/${dt}/ | awk 'NR==1{next}{print $NF}')
do
i=$(hdfs dfs -text $f | wc -l)
cnt=$((cnt+i))
done
-- 测试
for f in $(hdfs dfs -ls /logdata/applog/2022-03-16/ | awk 'NR==1{next}{print $NF}')
> do
> i=$(hdfs dfs -text $f | wc -l)
> cnt=$((cnt+i))
> echo $cnt
> done
==================================================00.2比对hdfs与日志服务器上的数据行数,确定是否去重计算========================================================
#!/bin/bash
dt=$(date -d'-1 day' +%Y-%m-%d)
if [ $1 ]; then
dt=$1
fi
metabus_host="linux03:8080"
# 请求元总线查询日志服务器上的日志行总数
logserver_cnt=$(curl http://${metabus_host}/api/get/applog?date=${dt})
echo "请求元总线得到的数据行数:${logserver_cnt}"
# 统计hdfs上的行总数
hdfs_cnt=0
for f in $(hdfs dfs -ls /logdata/applog/${dt}/ | awk 'NR==1{next}{print $NF}')
do
i=$(hdfs dfs -text $f | wc -l)
hdfs_cnt=$((hdfs_cnt+i))
echo "计算hdfs得到的数据行数:${hdfs_cnt}"
done
# 加载数据到临时表分区
sql1="alter table tmp.log_raw_tmp add partition(dt='${dt}') location '/logdata/applog/${dt}'";
# 去重
sql2="
set hive.exec.compress.output = true;
set mapred.output.compression.codec = org.apache.hadoop.io.compress.GzipCodec;
insert overwrite directory '/tmp/distinct_task/applog/${dt}'
select
line
from tmp.log_raw_tmp where dt='${dt}'
group by line;"
# 判断,如果hdfs上的行数>日志服务器上的行数,则启动去重计算
if [ ${hdfs_cnt} -gt ${logserver_cnt} ]; then
echo "检测到${dt}日志采集服务器目录中的数据行数>日志服务器上的日志行数,准备执行去重计算"
#启动去重计算
hive -e "${sql1}"
echo "加载数据到临时表..."
hive -e "${sql2}"
echo "执行去重计算任务..."
fi
if [ $? -eq 0 ]; then
echo "数据重复检测及去重处理完成"
exit 0
else
echo "数据重复检测及去重处理失败"
exit 1
fi