采集系统数据完整性监控(离线数仓项目)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值