

✨博客主页: https://blog.csdn.net/m0_63815035?type=blog
💗《博客内容》:大数据、Java、测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识
📢博客专栏: https://blog.csdn.net/m0_63815035/category_11954877.html
📢欢迎点赞 👍 收藏 ⭐留言 📝
📢本文为学习笔记资料,如有侵权,请联系我删除,疏漏之处还请指正🙉
📢大厦之成,非一木之材也;大海之阔,非一流之归也✨

问题:是不是比如一个核心ads层表,通过观察比如都是凌晨3点半跑完,给这个核心表增加基线比如制定3:40分,然后用一个shell脚本查询目标表是否调度完毕,如果否,就发邮件报警这种吗?如果不是,原理是什么?
回答:
数仓数据基线(即数据产出的时间/质量基准)的核心是"保障关键数据在指定时间前完成加工、且符合质量要求"。不借助平台时,需通过**"基线定义+任务依赖校验+监控告警"**的手动流程实现,你的思路是:"基线制定、依赖校验、监控告警、异常处理"全链路,具体如下:
一、先明确:数据基线的核心目标
数据基线包含两个维度:
- 时间基线:核心表/任务必须在指定时间前完成(比如ADS层核心报表表需在每日3:40前产出);
- 质量基线:数据需满足准确性、完整性(比如订单表当日数据量不低于昨日的80%)。
二、不借助平台的落地步骤(以"日更数仓"为例)
步骤1:定义核心数据基线(先明确"要保障什么")
先梳理数仓中的核心表/任务(比如支撑业务报表的ADS层表、下游依赖的DWS汇总表),给每个核心对象制定基线:
- 时间基线:基于历史任务耗时,设置"完成截止时间"(比如ADS层订单报表表,历史平均3:30完成,基线设为3:40);
- 质量基线:定义核心校验规则(比如订单表当日数据量≥昨日90%、用户ID无NULL值)。
示例基线表(可存在Hive/Excel中):
| 核心表名 | 时间基线 | 质量基线规则1 | 质量基线规则2 |
|---|---|---|---|
| ads_order_report | 每日3:40前 | 当日数据量≥昨日90% | user_id字段NULL率=0 |
| dws_user_act_d | 每日3:20前 | 活跃用户数≥昨日80% | 无重复user_id |
步骤2:任务依赖的"前置校验"(保障"上游数据就绪")
数仓任务是分层依赖的(比如ADS层依赖DWS层,DWS层依赖DWD层),所以在任务执行前,需先校验"上游依赖的表/分区是否已完成且符合质量",避免无效执行。
-
实现方式:在任务的Shell脚本中,添加"依赖校验SQL",执行任务前先跑校验,不通过则直接失败并告警。
-
示例(Shell+Hive SQL) :
bash# 校验上游DWS层表的当日分区是否存在(时间基线) check_dws() { hive -e " SHOW PARTITIONS dws_user_act_d PARTITION(dt='${today}'); " > /tmp/dws_check.log # 若分区不存在,直接退出并告警 if [ $? -ne 0 ]; then echo "上游dws_user_act_d的${today}分区未产出" | mail -s "任务依赖失败" data_team@xxx.com exit 1 fi } # 校验上游表数据量是否符合质量基线 check_dws_quality() { yesterday=$(date -d "-1 day" +%Y-%m-%d) # 查当日和昨日数据量 count_today=$(hive -e "SELECT COUNT(*) FROM dws_user_act_d WHERE dt='${today}'") count_yesterday=$(hive -e "SELECT COUNT(*) FROM dws_user_act_d WHERE dt='${yesterday}'") # 若当日数据量<昨日80%,退出告警 if [ $count_today -lt $((count_yesterday * 80 / 100)) ]; then echo "dws_user_act_d数据量不足:今日${count_today},昨日${count_yesterday}" | mail -s "数据质量不达标" data_team@xxx.com exit 1 fi } # 先执行校验,再跑任务 check_dws check_dws_quality # 校验通过,执行当前任务 hive -f /script/ads_order_report.sql
步骤3:核心表的"基线监控"(保障"按时按质产出")
针对核心表的时间基线+质量基线,单独写一个"监控脚本",定时运行(比如每10分钟跑一次),检查核心表是否达标。
-
时间基线监控示例(Shell):
bashtoday=$(date +%Y-%m-%d) # 检查ads_order_report的当日分区是否在3:40前产出 check_time() { current_time=$(date +%H:%M) # 判断当前时间是否超过3:40 if [ "$current_time" \> "03:40" ]; then # 检查分区是否存在 hive -e "SHOW PARTITIONS ads_order_report PARTITION(dt='${today}')" > /tmp/ads_check.log if [ $? -ne 0 ]; then echo "ads_order_report未在3:40前产出" | mail -s "时间基线告警" data_team@xxx.com fi fi } -
质量基线监控示例(Hive SQL+Shell):
bashcheck_quality() { # 检查user_id的NULL率 null_rate=$(hive -e " SELECT COUNT(CASE WHEN user_id IS NULL THEN 1 END)/COUNT(*) FROM ads_order_report WHERE dt='${today}' ") if [ $null_rate -gt 0 ]; then echo "ads_order_report的user_id存在NULL值" | mail -s "质量基线告警" data_team@xxx.com fi }
步骤4:异常告警与重试(保障"出问题能及时处理")
-
告警方式 :用Shell的
mail命令发邮件,或调用企业微信/钉钉的API发消息(需申请机器人Webhook); -
重试机制 :在任务脚本中添加"失败重试逻辑"(比如失败后等待5分钟重试2次),避免临时网络波动导致的异常。
bash# 任务重试示例 retry_count=0 max_retry=2 while [ $retry_count -le $max_retry ]; do hive -f /script/ads_order_report.sql if [ $? -eq 0 ]; then echo "任务成功" exit 0 else retry_count=$((retry_count + 1)) echo "任务失败,第${retry_count}次重试" sleep 300 # 等待5分钟 fi done # 重试失败,告警 echo "任务重试失败" | mail -s "任务失败告警" data_team@xxx.com
四、方案的优缺点
- 优点:不依赖平台,成本低,灵活可控(能根据业务自定义规则);
- 缺点:需手动写大量脚本,维护成本高(比如新增核心表要改监控脚本),无可视化界面(告警需查邮件/日志)。
csharp
今天这篇文章就到这里了,大厦之成,非一木之材也;大海之阔,非一流之归也。感谢大家观看本文
