先給結(jié)論,不繞彎:大多數(shù)公司的數(shù)據(jù)治理失敗,不是因為技術(shù)不行, 而是從一開始就 搞反了方向。
很多人以為的治理是:
加規(guī)則
上平臺
定流程
抓考核
但真實世界里,治理的本質(zhì)只有一件事:
降低數(shù)據(jù)使用過程中的摩擦成本。
如果一套治理方案:
讓開發(fā)更慢
讓排查更難
讓責(zé)任更模糊
那它一定會失敗,而且失敗得很快。
只要有人在群里說:
"這個要不要納入數(shù)據(jù)治理?"
接下來通常是:
工程師沉默
業(yè)務(wù)皺眉
管理者興奮
原因只有一個:"數(shù)據(jù)治理"這四個字,在很多公司已經(jīng)被用壞了。
工程師眼里的治理
字段要補 20 個元數(shù)據(jù)
表血緣有問題,責(zé)任在我
口徑不一致,我來改
平臺規(guī)則一堆,排障還得靠自己
一句話總結(jié):
治理 = 額外負擔(dān) + 潛在風(fēng)險
業(yè)務(wù)眼里的治理
以前能直接查
現(xiàn)在要提申請
口徑還更復(fù)雜了
他們的直覺是:
治理 ≠ 更好用 治理 = 更麻煩
真正的問題
數(shù)據(jù)治理長期只在約束供給側(cè), 卻很少優(yōu)化使用體驗。
不解決摩擦,卻不斷強調(diào)規(guī)范, 治理必然會變成組織內(nèi)耗。



很多公司一做治理,就直奔:
血緣
口徑
質(zhì)量
聽起來專業(yè),但90% 的公司都踩進了同一批坑。
1?? 血緣幻覺:你以為看見了,其實沒用
典型血緣平臺:
表 → 表 → 表
字段級血緣密密麻麻
圖畫得像電路板
但排查問題時,沒人用。
因為它回答不了三個關(guān)鍵問題:
出問題該看哪?
誰該負責(zé)?
會影響什么?
如果血緣不能解決這三點, 對工程師的實際價值是?。



問題:
節(jié)點太多,看不清主路徑
找不到關(guān)鍵依賴
不知道影響范圍



關(guān)鍵改進:
只顯示
關(guān)鍵路徑,不是所有表
每個節(jié)點標注
責(zé)任人和
SLA 邊上標注
任務(wù)ID和
監(jiān)控狀態(tài) 提供
明確的排查路徑 -- 表級別元數(shù)據(jù)(最小可行方案)CREATETABLE?meta_table_lineage (? ? table_name?VARCHAR(200),? ? owner?VARCHAR(50), ? ? ? ? ? ? ?-- 責(zé)任人(必填)? ? business_scene?VARCHAR(200), ? ?-- 業(yè)務(wù)場景(必填)? ? sla_time?VARCHAR(20), ? ? ? ? ??-- SLA時間(必填)? ? upstream_critical?TEXT, ? ? ? ??-- 關(guān)鍵上游(JSON格式)? ? downstream_count?INT, ? ? ? ? ??-- 下游表數(shù)量? ? oncall_contact?VARCHAR(100), ? ?-- 出問題找誰(必填)? ? last_incident_date?DATE, ? ? ? ?-- 最近一次故障時間? ? impact_level?VARCHAR(20) ? ? ? ?-- 影響等級:P0/P1/P2);-- 示例數(shù)據(jù)INSERTINTO?meta_table_lineage?VALUES?(? ??'dws_order_trade_1d',? ??'王五',? ??'交易大盤-首頁核心指標',? ??'T+1 08:00',? ??'["ods_order", "dwd_order_detail"]',? ??12,? ??'王五 @wangwu (微信: wx_wangwu)',? ??'2024-11-23',? ??'P0');
核心思想:
只記錄
救命信息,不追求完美
能讓工程師
3分鐘定位問題 責(zé)任清晰,不讓人背鍋
2?? 口徑幻覺:你統(tǒng)一了定義,卻沒統(tǒng)一場景
現(xiàn)實中的"統(tǒng)一指標"往往變成:
一張官方指標表
一堆沒人敢用的字段
業(yè)務(wù)繼續(xù)自己算
原因很簡單:
口徑不是對錯問題,是使用場景問題。
運營要快
財務(wù)要準
分析要可解釋
強行統(tǒng)一,只會逼著大家繞開你。
-- 所謂的"統(tǒng)一口徑"CREATE?TABLE?dim_metric_standard (? ? metric_name?VARCHAR(100),? ? metric_define?TEXT,? ? calculation_logic?TEXT,? ? create_time?TIMESTAMP);-- 結(jié)果是:-- 1. 定義寫得像論文,沒人看-- 2. 業(yè)務(wù)場景沒有覆蓋-- 3. 實際使用時還是各算各的
真實場景:
|
場景
|
GMV口徑
|
為什么不同
|
|
運營日報
|
下單金額
|
要實時,快速響應(yīng)
|
|
財務(wù)報表
|
確認收入金額
|
要準確,符合財務(wù)準則
|
|
CEO看板
|
支付金額
|
要直觀,反映現(xiàn)金流
|
|
算法訓(xùn)練
|
去退款后金額
|
要干凈,提升模型效果
|



核心改進:
不強求統(tǒng)一,而是明確場景
每個場景提供
指定表,不讓用戶自己算
清晰標注
延遲和
責(zé)任人 CREATE?TABLE?meta_metric_registry (? ? metric_name?VARCHAR(100), ? ? ??-- 指標名稱? ? business_scene?VARCHAR(200), ? ?-- 業(yè)務(wù)場景? ? metric_definition?TEXT, ? ? ? ??-- 口徑定義(白話文)? ? recommended_table?VARCHAR(200),?-- 推薦使用的表? ? sql_template?TEXT, ? ? ? ? ? ? ?-- SQL模板? ? data_latency?VARCHAR(50), ? ? ??-- 數(shù)據(jù)延遲? ? owner?VARCHAR(50), ? ? ? ? ? ? ?-- 責(zé)任人? ? usage_count?INT, ? ? ? ? ? ? ? ?-- 使用次數(shù)(重要)? ? last_verify_date?DATE? ? ? ? ? ?-- 最近校驗時間);-- 示例:GMV指標的場景化管理INSERTINTO?meta_metric_registry?VALUES(? ??'GMV',? ??'運營日報-實時監(jiān)控',? ??'下單金額,包含未支付訂單,用于實時監(jiān)控業(yè)務(wù)波動',? ??'ads_order_gmv_realtime',? ??'SELECT DATE(order_time) as dt, SUM(order_amount) as gmv FROM ads_order_gmv_realtime WHERE dt = ''${date}'' GROUP BY dt',? ??'5分鐘',? ??'張三',? ??1580,? ??'2024-12-10'),(? ??'GMV',? ??'財務(wù)報表-月度結(jié)算',? ??'確認收入金額,已支付且未退款,符合財務(wù)確認準則',? ??'ads_finance_gmv_daily',? ??'SELECT DATE(confirm_time) as dt, SUM(confirm_amount) as gmv FROM ads_finance_gmv_daily WHERE dt BETWEEN ''${start_date}'' AND ''${end_date}'' GROUP BY dt',? ??'T+1',? ??'李四',? ??320,? ??'2024-12-10');
使用方式:
-- 用戶查詢時,系統(tǒng)自動推薦SELECT?*?FROM?meta_metric_registryWHERE?metric_name =?'GMV'??AND?business_scene?LIKE?'%實時%'ORDER?BY?usage_count?DESC;-- 返回:推薦使用 ads_order_gmv_realtime-- 提供SQL模板,直接替換日期即可使用
3?? 質(zhì)量幻覺:你監(jiān)控了,但問題依舊
常見質(zhì)量規(guī)則:
非空率
波動率
行數(shù)校驗
結(jié)果是:
報警一堆
真問題被淹沒
人逐漸麻木
最終:
系統(tǒng)"看起來很安全", 實際沒人真正信數(shù)據(jù)。
# 典型的"過度監(jiān)控"quality_rules = [? ? {"table":?"dwd_order",?"rule":?"not_null",?"column":?"order_id"},? ? {"table":?"dwd_order",?"rule":?"not_null",?"column":?"user_id"},? ? {"table":?"dwd_order",?"rule":?"not_null",?"column":?"create_time"},? ? {"table":?"dwd_order",?"rule":?"range_check",?"column":?"amount",?"min":?},? ? {"table":?"dwd_order",?"rule":?"enum_check",?"column":?"status"},? ? {"table":?"dwd_order",?"rule":?"row_count_change",?"threshold":?0.1},? ? {"table":?"dwd_order",?"rule":?"duplicate_check",?"column":?"order_id"},? ??# ... 100+ 條規(guī)則]# 結(jié)果:# 1. 每天報警50+條# 2. 真正的業(yè)務(wù)問題被淹沒# 3. 所有人屏蔽報警 


# 只監(jiān)控"真正會讓業(yè)務(wù)炸掉"的問題critical_quality_rules = {? ??"dws_order_trade_1d": [? ? ? ? {? ? ? ? ? ??"rule_name":?"GMV為0檢測",? ? ? ? ? ??"rule_type":?"business_logic",? ? ? ? ? ??"sql":?"""? ? ? ? ? ? ? ? SELECT COUNT(*) as cnt? ? ? ? ? ? ? ? FROM dws_order_trade_1d? ? ? ? ? ? ? ? WHERE dt = '${date}' AND total_gmv = 0? ? ? ? ? ? """,? ? ? ? ? ??"threshold":?, ?# GMV不能為0? ? ? ? ? ??"alert_level":?"P0",? ? ? ? ? ??"action":?"阻斷下游任務(wù)",? ? ? ? ? ??"owner":?"張三",? ? ? ? ? ??"business_impact":?"CEO看板數(shù)據(jù)為0,影響決策"? ? ? ? },? ? ? ? {? ? ? ? ? ??"rule_name":?"數(shù)據(jù)延遲檢測",? ? ? ? ? ??"rule_type":?"sla",? ? ? ? ? ??"sql":?"""? ? ? ? ? ? ? ? SELECT MAX(update_time) as last_update? ? ? ? ? ? ? ? FROM dws_order_trade_1d? ? ? ? ? ? ? ? WHERE dt = '${date}'? ? ? ? ? ? """,? ? ? ? ? ??"threshold":?"08:00",? ? ? ? ? ??"alert_level":?"P0",? ? ? ? ? ??"action":?"告警+自動重跑",? ? ? ? ? ??"owner":?"張三",? ? ? ? ? ??"business_impact":?"早會看不到數(shù)據(jù)"? ? ? ? }? ? ]}# 執(zhí)行邏輯def?check_quality(table_name, date):? ? rules = critical_quality_rules.get(table_name, [])? ??for?rule?in?rules:? ? ? ? result = execute_sql(rule['sql'].replace('${date}', date))? ? ? ??ifnot?pass_check(result, rule['threshold']):? ? ? ? ? ??# P0級:阻斷+告警? ? ? ? ? ??if?rule['alert_level'] ==?'P0':? ? ? ? ? ? ? ? block_downstream_tasks(table_name)? ? ? ? ? ? ? ? send_alert(? ? ? ? ? ? ? ? ? ? owner=rule['owner'],? ? ? ? ? ? ? ? ? ? message=f"{rule['rule_name']}失敗,業(yè)務(wù)影響:{rule['business_impact']}",? ? ? ? ? ? ? ? ? ? channel=['電話',?'短信',?'企業(yè)微信']? ? ? ? ? ? ? ? )? ? ? ? ? ??# P1級:告警不阻斷? ? ? ? ? ??elif?rule['alert_level'] ==?'P1':? ? ? ? ? ? ? ? send_alert(? ? ? ? ? ? ? ? ? ? owner=rule['owner'],? ? ? ? ? ? ? ? ? ? message=f"{rule['rule_name']}異常",? ? ? ? ? ? ? ? ? ? channel=['企業(yè)微信']? ? ? ? ? ? ? ? )
核心原則:
只監(jiān)控3-5條真正致命的規(guī)則 每條規(guī)則必須說清楚
業(yè)務(wù)影響 P0級規(guī)則:必須
阻斷下游 告警必須
可操作:告訴我該怎么辦
很多公司治理受挫后會想:
"是不是我們平臺不夠好?"
于是開始選型、招標、自研、All in 平臺。
但結(jié)論很明確:
平臺只能放大認知,救不了錯誤方向。



平臺的三大幻覺
? 錯誤平臺功能清單:- 血緣分析(表級+字段級+代碼級)- 元數(shù)據(jù)管理(20+個字段)- 數(shù)據(jù)地圖(全表展示)- 質(zhì)量監(jiān)控(100+規(guī)則模板)- 成本分析- 數(shù)據(jù)安全- 數(shù)據(jù)資產(chǎn)評估- ...結(jié)果:每個功能都是半成品,沒有一個真正好用
? 正確平臺功能清單:- 核心表快速查詢(只管TOP 50表)- 責(zé)任人一鍵聯(lián)系(出問題找得到人)- 問題快速定位(3步找到根因)結(jié)果:功能少但每個都好用,工程師主動用
某大廠數(shù)據(jù)治理平臺架構(gòu):



問題:
建設(shè)周期:18個月
團隊規(guī)模:15人
實際使用率:<5%
工程師反饋:"太復(fù)雜,還是用SQL查快"
真相是:
平臺只能降低協(xié)作成本,不能替代業(yè)務(wù)理解。



實際工作占比:
平臺能解決的(配置、權(quán)限、查詢):20%
平臺解決不了的(口徑理解、業(yè)務(wù)判斷):80%
這一節(jié)非常關(guān)鍵,順序錯了,后面全是返工。
? 唯一正確的順序
先解決"用得順不順", 再談"規(guī)不規(guī)范"。
graph TD? ? A[第一步: 識別高價值表] --> B[找出TOP 10核心表]? ? B --> C[第二步: 貼著問題治理]? ? C --> D[這些表最常見的問題是什么?]? ? D --> E[第三步: 讓工程師少背鍋]? ? E --> F[快速定位+責(zé)任清晰]? ? F --> G[第四步: 驗證效果]? ? G --> H{排查時間減少50%?}? ? H -->|是| I[擴展到更多表]? ? H -->|否| J[回到第二步調(diào)整]? ? style H fill:#ffd43b? ? style I fill:#51cf66
第一步:只治理高價值、高頻數(shù)據(jù)
先回答:
哪些表用得最多?
出問題影響最大?
從 10 張核心表開始, 永遠好過從 1000 張表開始。
-- 方法1:統(tǒng)計查詢頻率SELECT? ? table_name,? ??COUNT(*)?as?query_count,? ??COUNT(DISTINCT?user_id)?as?user_countFROM?query_logWHERE?dt >=?DATE_SUB(CURRENT_DATE,?30)GROUPBY?table_nameORDERBY?query_count?DESCLIMIT20;-- 方法2:統(tǒng)計故障影響SELECT? ? table_name,? ??COUNT(*)?as?incident_count,? ??SUM(CASEWHENlevel?=?'P0'THEN1ELSEEND)?as?p0_countFROM?incident_logWHERE?dt >=?DATE_SUB(CURRENT_DATE,?90)GROUPBY?table_nameORDERBY?incident_count?DESCLIMIT20;-- 方法3:詢問業(yè)務(wù)方-- "如果這張表數(shù)據(jù)不準,你會怎么辦?"-- 回答"業(yè)務(wù)就停了" -> 核心表-- 回答"那就換個表查" -> 非核心表
|
表名
|
業(yè)務(wù)場景
|
查詢頻次/天
|
故障影響
|
治理優(yōu)先級
|
|
dws_order_trade_1d
|
CEO看板
|
1200+
|
P0-業(yè)務(wù)決策
|
1
|
|
dws_user_behavior_1d
|
用戶分析
|
800+
|
P1-分析延遲
|
2
|
|
ads_gmv_hourly
|
實時大盤
|
2000+
|
P0-實時監(jiān)控
|
1
|
|
dwd_order_detail
|
訂單明細
|
3000+
|
P0-多場景依賴
|
1
|
|
dim_user
|
用戶維度
|
5000+
|
P1-查詢慢
|
3
|
治理策略:
優(yōu)先級1(3張表):完整治理,P0級監(jiān)控
優(yōu)先級2(5張表):基礎(chǔ)治理,P1級監(jiān)控
優(yōu)先級3(其他):只補充責(zé)任人信息
第二步:貼著真實問題做治理
不要一上來就:
畫藍圖
定模型
寫規(guī)范
而是問:
這個表最常見的問題是什么?
延遲?口徑?含義不清?
治理不是設(shè)計題,是排障題。
問題1:某表經(jīng)常延遲,影響早會
# 不是加監(jiān)控規(guī)則,而是:# 1. 分析延遲原因問題根因:上游ods表凌晨6點才到,處理需要1.5小時,SLA是7:30但經(jīng)常超時# 2. 針對性優(yōu)化優(yōu)化方案:- 和上游團隊協(xié)調(diào),ods表提前到5:30- 優(yōu)化ETL邏輯,處理時間從1.5h降到40min- 增加SLA監(jiān)控,7:00未完成則告警# 3. 補充治理元數(shù)據(jù)meta_table_lineage 添加:- sla_time:?'07:30'- critical_dependency:?'ods_order (需在05:30前完成)'- optimization_history:?'2024-12優(yōu)化,處理時間從1.5h降到40min'
問題2:某表口徑經(jīng)常被問
# 不是寫文檔,而是:# 1. 分析為什么被頻繁咨詢問題根因:GMV字段有3個(gmv_total/gmv_paid/gmv_confirm),用哪個不清楚# 2. 針對性優(yōu)化優(yōu)化方案:- 在表注釋中直接寫清楚:"""? gmv_total: 下單金額,包含未支付? gmv_paid: 支付金額,運營日報用這個? gmv_confirm: 確認收入,財務(wù)報表用這個? """- 在數(shù)據(jù)平臺查詢頁面,字段旁邊加tooltip提示- 提供SQL模板,讓用戶直接復(fù)制# 3. 效果驗證- 優(yōu)化前:每周被咨詢5次- 優(yōu)化后:每周被咨詢0.5次
第三步:讓工程師"少背鍋"
這是成敗的關(guān)鍵:
能否快速定位問題?
責(zé)任是否清晰?
是系統(tǒng)問題還是人問題?
如果治理的結(jié)果是:
"以后出問題,更容易找到人"
那工程師一定會抵觸。
# 當 dws_order_trade_1d 數(shù)據(jù)異常時# 傳統(tǒng)方式:1.?查看任務(wù)日志(10分鐘)2.?找DBA查上游表狀態(tài)(等待20分鐘)3.?翻看代碼找依賴關(guān)系(15分鐘)4.?聯(lián)系上游負責(zé)人(可能找不到人)總耗時:45分鐘+# 治理后方式:系統(tǒng)自動分析:



# 系統(tǒng)返回:{? ??"table":?"dws_order_trade_1d",? ??"issue":?"數(shù)據(jù)量異常(降低60%)",? ??"root_cause":?"上游表 ods_order 延遲2小時",? ??"responsible": {? ? ? ??"name":?"張三",? ? ? ??"team":?"
數(shù)據(jù)采集組",? ? ? ??"contact":?"@zhangsan (138****1234)"? ? },? ??"impact": {? ? ? ??"downstream_count":?12,? ? ? ??"business_impact":?"CEO看板/運營日報 受影響"? ? },? ??"suggested_action":?"聯(lián)系張三確認ods_order延遲原因",? ??"diagnosis_time":?"15秒"}總耗時:15秒
下面是一套可以真實落地的輕治理方案。
核心原則 

?
1?? 治理對象要極少
核心事實表
核心指標表
高 SLA 表
不要貪多。
# 核心表判斷標準def?is_critical_table(table_name):? ??"""? ? 滿足以下任一條件即為核心表:? ? 1. 每天查詢 > 100次? ? 2. 依賴的下游表 > 10張? ? 3. 過去3個月出過P0故障? ? 4. 支撐CEO/高管看板? ? """? ? criteria = {? ? ? ??"high_frequency": get_daily_query_count(table_name) >?100,? ? ? ??"high_dependency": get_downstream_count(table_name) >?10,? ? ? ??"high_impact": has_p0_incident(table_name, days=90),? ? ? ??"executive_dashboard": is_in_executive_dashboard(table_name)? ? }? ??return?any(criteria.values())# 實際應(yīng)用critical_tables = [t?for?t?in?all_tables?if?is_critical_table(t)]print(f"核心表數(shù)量:?{len(critical_tables)}?/?{len(all_tables)}")# 典型輸出:核心表數(shù)量: 15 / 850
2?? 元數(shù)據(jù)只填"救命信息"
不追求完美描述,只保留三點:
誰維護
干嘛用
出問題找誰
這比 20 個規(guī)范字段都值錢。
CREATE?TABLE?meta_critical_tables (? ??-- 基礎(chǔ)信息? ? table_name?VARCHAR(200) PRIMARY?KEY,? ? table_desc?VARCHAR(500), ? ? ? ? ??-- 一句話說清楚干嘛用? ??-- 救命信息(必填)? ? owner?VARCHAR(50)?NOTNULL, ? ? ? ?-- 責(zé)任人? ? oncall_contact?VARCHAR(200)?NOTNULL, ?-- 聯(lián)系方式(企業(yè)微信/手機)? ? business_scene?VARCHAR(200)?NOTNULL, ?-- 業(yè)務(wù)場景? ??-- SLA信息? ? sla_time?VARCHAR(20), ? ? ? ? ? ? ?-- 期望完成時間? ? data_latency?VARCHAR(50), ? ? ? ? ?-- 實際延遲情況? ??-- 依賴信息(簡化版)? ? critical_upstream?VARCHAR(500), ? ?-- 關(guān)鍵上游(JSON數(shù)組)? ? downstream_count?INT, ? ? ? ? ? ? ?-- 下游表數(shù)量? ??-- 故障歷史? ? last_incident_date?DATE, ? ? ? ? ??-- 最近故障時間? ? incident_count_3m?INT, ? ? ? ? ? ??-- 近3個月故障次數(shù)? ??-- 更新時間? ? update_time?TIMESTAMPDEFAULTCURRENT_TIMESTAMP);-- 示例數(shù)據(jù)INSERTINTO?meta_critical_tables?VALUES?(? ??'dws_order_trade_1d',? ??'訂單交易日匯總表,支撐CEO看板和運營日報',? ??'王五',? ??'@wangwu (微信: wx_wangwu, 手機: 138****5678)',? ??'CEO看板、運營日報、財務(wù)對賬',? ??'T+1 08:00',? ??'通常07:30完成',? ??'["ods_order", "dwd_order_detail", "dim_user"]',? ??12,? ??'2024-11-23',? ??2,? ??NOW());
填寫要求:
table_desc:用一句話說清楚,不要寫技術(shù)術(shù)語
? "基于Kimball維度建模的訂單主題寬表"
? "訂單交易匯總表,用于CEO看板"
oncall_contact:必須能立刻聯(lián)系上
? "數(shù)據(jù)開發(fā)組"
? "@wangwu (微信: wx_wangwu, 緊急電話: 138****5678)"
3?? 質(zhì)量規(guī)則只防"致命錯誤"
不追求完美數(shù)據(jù)
只防業(yè)務(wù)不可接受的問題
規(guī)則少,但每一條都真的有人 care。
# 規(guī)則分級標準質(zhì)量規(guī)則分級:P0級(阻斷級):- 觸發(fā)條件:數(shù)據(jù)錯誤導(dǎo)致業(yè)務(wù)決策完全錯誤- 示例:GMV為、交易量降低80%、關(guān)鍵字段全為NULL- 響應(yīng):阻斷下游任務(wù) + 電話告警- 數(shù)量:每張表不超過3條P1級(告警級):- 觸發(fā)條件:數(shù)據(jù)不完美但可用- 示例:某地區(qū)數(shù)據(jù)缺失、延遲超過1小時- 響應(yīng):企業(yè)微信告警- 數(shù)量:每張表不超過5條P2級(記錄級):- 觸發(fā)條件:數(shù)據(jù)優(yōu)化項- 示例:填充率略低、字段冗余- 響應(yīng):周報匯總- 數(shù)量:不限
# dws_order_trade_1d 質(zhì)量規(guī)則配置table:dws_order_trade_1downer:王五rules:# P0級規(guī)則-name:GMV為0檢測? ??level:P0? ??sql:|? ? ? SELECT COUNT(*) as issue_count? ? ? FROM dws_order_trade_1d? ? ? WHERE dt = '${date}' AND total_gmv = 0? ??threshold:# 不允許為0? ??alert:? ? ??channels:[phone,sms,wechat]? ? ??message:"【P0】dws_order_trade_1d GMV為0,CEO看板受影響"? ??action:? ? ??block_downstream:true? ? ??auto_rollback:true-name:數(shù)據(jù)量斷崖檢測? ??level:P0? ??sql:|? ? ? SELECT? ? ? ? today.order_count,? ? ? ? avg_7d.avg_count,? ? ? ? (today.order_count - avg_7d.avg_count) / avg_7d.avg_count as change_rate? ? ? FROM? ? ? ? (SELECT COUNT(*) as order_count FROM dws_order_trade_1d WHERE dt = '${date}') today,? ? ? ? (SELECT AVG(order_count) as avg_count FROM (? ? ? ? ? SELECT COUNT(*) as order_count FROM dws_order_trade_1d? ? ? ? ? WHERE dt BETWEEN DATE_SUB('${date}', 7) AND DATE_SUB('${date}', 1)? ? ? ? ? GROUP BY dt? ? ? ? )) avg_7d? ??threshold:-0.5# 降低超過50%? ??alert:? ? ??channels:[phone,wechat]? ? ??message:"【P0】dws_order_trade_1d 數(shù)據(jù)量驟降{change_rate}%"? ??action:? ? ??block_downstream:true-name:SLA超時檢測? ??level:P0? ??sql:|? ? ? SELECT MAX(update_time) as last_update? ? ? FROM dws_order_trade_1d? ? ? WHERE dt = '${date}'? ??threshold:"08:00"# 必須在8點前完成? ??alert:? ? ??channels:[wechat]? ? ??message:"【P0】dws_order_trade_1d 未按時完成,影響早會"? ??action:? ? ??block_downstream:false? ? ??auto_retry:true# P1級規(guī)則-name:關(guān)鍵維度缺失檢測? ??level:P1? ??sql:|? ? ? SELECT? ? ? ? SUM(CASE WHEN province IS NULL THEN 1 ELSE 0 END) as null_count,? ? ? ? COUNT(*) as total_count? ? ? FROM dws_order_trade_1d? ? ? WHERE dt = '${date}'? ??threshold:0.01# 空值率不超過1%? ??alert:? ? ??channels:[wechat]? ? ??message:"【P1】dws_order_trade_1d 省份字段空值率超標"? ??action:? ? ??block_downstream:false
4?? 治理結(jié)果必須"立刻可感知"
查數(shù)更快
排障更清晰
溝通成本更低
只要工程師覺得省事了,治理就活了。
|
場景
|
治理前
|
治理后
|
改善目標
|
|
找表
|
不知道用哪張表,要問人
|
數(shù)據(jù)平臺推薦表,附帶SQL模板
|
從10分鐘到30秒
|
|
查責(zé)任人
|
翻文檔/問群/找上級
|
一鍵查看聯(lián)系方式
|
從30分鐘到10秒
|
|
排查故障
|
手動查日志/猜測依賴
|
自動診斷根因+影響范圍
|
從1小時到2分鐘
|
|
理解口徑
|
找文檔/問業(yè)務(wù)/猜
|
表注釋/字段說明/SQL模板
|
從20分鐘到1分鐘
|
場景:dws_order_trade_1d 數(shù)據(jù)異常
# 治理前的排查流程1.?發(fā)現(xiàn)問題(業(yè)務(wù)反饋數(shù)據(jù)不對) ? ? ? ? ?->?10分鐘2.?登錄調(diào)度平臺查看任務(wù)狀態(tài) ? ? ? ? ? ? ->?5分鐘3.?發(fā)現(xiàn)任務(wù)成功但數(shù)據(jù)異常 ? ? ? ? ? ? ? ->?5分鐘4.?查看代碼找上游依賴關(guān)系 ? ? ? ? ? ? ? ->?15分鐘5.?逐個檢查上游表數(shù)據(jù)質(zhì)量 ? ? ? ? ? ? ? ->?30分鐘6.?發(fā)現(xiàn) ods_order 有問題 ? ? ? ? ? ? ? ?->?5分鐘7.?找 ods_order 負責(zé)人(問了3個人) ? ? ?->?20分鐘8.?等待上游修復(fù) ? ? ? ? ? ? ? ? ? ? ? ? ->?2小時9.?重跑任務(wù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ->?30分鐘總計:3小時40分鐘# 治理后的排查流程1.?系統(tǒng)自動檢測異常并告警 ? ? ? ? ? ? ? ?-> 實時2.?告警直接顯示根因:ods_order延遲 ? ? ?->?分鐘3.?告警附帶責(zé)任人聯(lián)系方式 ? ? ? ? ? ? ? ?->?分鐘4.?一鍵聯(lián)系上游負責(zé)人 ? ? ? ? ? ? ? ? ? ?->?1分鐘5.?等待上游修復(fù) ? ? ? ? ? ? ? ? ? ? ? ? ->?2小時6.?系統(tǒng)自動重跑 ? ? ? ? ? ? ? ? ? ? ? ? ->?分鐘總計:2小時1分鐘時間節(jié)省:45%人力節(jié)省:70%(大部分自動化)
Week 1-2:識別核心表
# 任務(wù)清單tasks = [? ??"1. 統(tǒng)計過去3個月所有表的查詢頻次",? ??"2. 統(tǒng)計過去3個月的數(shù)據(jù)故障記錄",? ??"3. 訪談5個核心業(yè)務(wù)方,了解關(guān)鍵表",? ??"4. 匯總得出TOP 15核心表清單",? ??"5. 和各表負責(zé)人確認治理優(yōu)先級"]# 產(chǎn)出物deliverables = {? ??"核心表清單":?"Excel,包含表名/負責(zé)人/業(yè)務(wù)場景/優(yōu)先級",? ??"訪談記錄":?"了解業(yè)務(wù)方最痛的數(shù)據(jù)問題",? ??"治理計劃":?"明確接下來4周要做什么"}
Week 3-4:補齊救命信息
# 任務(wù)清單tasks = [? ??"1. 為TOP 15表補充元數(shù)據(jù)(責(zé)任人/聯(lián)系方式/業(yè)務(wù)場景)",? ??"2. 梳理關(guān)鍵上下游依賴關(guān)系",? ??"3. 定義3-5條P0級質(zhì)量規(guī)則",? ??"4. 搭建簡易的元數(shù)據(jù)查詢頁面"]# 產(chǎn)出物deliverables = {? ??"元數(shù)據(jù)表":?"meta_critical_tables 完成填充",? ??"質(zhì)量規(guī)則":?"每張核心表配置好監(jiān)控規(guī)則",? ??"查詢頁面":?"工程師能快速查到責(zé)任人和聯(lián)系方式"}
Week 5-6:驗證效果
# 任務(wù)清單tasks = [? ??"1. 灰度上線質(zhì)量監(jiān)控,觀察告警準確率",? ??"2. 收集工程師反饋,調(diào)整元數(shù)據(jù)展示",? ??"3. 統(tǒng)計故障排查時間,對比治理前后",? ??"4. 總結(jié)成功案例,推廣到更多表"]# 驗收指標metrics = {? ??"故障排查時間":?"減少50%以上",? ??"找人時間":?"從30分鐘降到1分鐘",? ??"工程師滿意度":?">=80%",? ??"元數(shù)據(jù)使用率":?"每天至少10次查詢"}
如果你們現(xiàn)在的治理:
文檔很多
平臺很重
卻沒人主動用
那你們做的可能不是數(shù)據(jù)治理,而是:
數(shù)據(jù)管理表演。
真正好的治理是潤物細無聲的, 它不會天天被提起,但所有人都離不開。
1. 核心表識別SQL
-- 識別核心表(綜合查詢頻次、下游依賴、故障歷史)WITH?query_stats?AS?(? ??SELECT? ? ? ? table_name,? ? ? ??COUNT(*)?as?query_count,? ? ? ??COUNT(DISTINCT?user_id)?as?user_count? ??FROM?query_log? ??WHERE?dt >=?DATE_SUB(CURRENT_DATE,?30)? ??GROUPBY?table_name),lineage_stats?AS?(? ??SELECT? ? ? ? upstream_table?as?table_name,? ? ? ??COUNT(DISTINCT?downstream_table)?as?downstream_count? ??FROM?table_lineage? ??GROUPBY?upstream_table),incident_stats?AS?(? ??SELECT? ? ? ? table_name,? ? ? ??COUNT(*)?as?incident_count,? ? ? ??SUM(CASEWHENlevel?=?'P0'THEN1ELSEEND)?as?p0_count? ??FROM?incident_log? ??WHERE?dt >=?DATE_SUB(CURRENT_DATE,?90)? ??GROUPBY?table_name)SELECT? ??COALESCE(q.table_name, l.table_name, i.table_name)?as?table_name,? ??COALESCE(q.query_count,?)?as?query_count,? ??COALESCE(l.downstream_count,?)?as?downstream_count,? ??COALESCE(i.p0_count,?)?as?p0_count,? ??-- 綜合評分? ??COALESCE(q.query_count,?) *?0.3?+? ??COALESCE(l.downstream_count,?) *?10?*?0.4?+? ??COALESCE(i.p0_count,?) *?100?*?0.3as?priority_scoreFROM?query_stats qFULLOUTERJOIN?lineage_stats l?ON?q.table_name = l.table_nameFULLOUTERJOIN?incident_stats i?ON?q.table_name = i.table_nameORDERBY?priority_score?DESCLIMIT20;
2. 故障自動診斷腳本
#!/usr/bin/env python3"""數(shù)據(jù)異常自動診斷腳本當數(shù)據(jù)質(zhì)量監(jiān)控發(fā)現(xiàn)異常時,自動分析根因"""def?diagnose_table_issue(table_name, date):? ??"""? ? 自動診斷表數(shù)據(jù)異常? ? """? ? result = {? ? ? ??"table": table_name,? ? ? ??"date": date,? ? ? ??"status":?"unknown",? ? ? ??"root_cause":?None,? ? ? ??"responsible":?None,? ? ? ??"impact":?None,? ? ? ??"suggested_action":?None? ? }? ??# 1. 檢查任務(wù)執(zhí)行狀態(tài)? ? task_status = check_task_status(table_name, date)? ??if?task_status !=?"SUCCESS":? ? ? ? result["status"] =?"task_failed"? ? ? ? result["root_cause"] =?f"任務(wù)執(zhí)行失敗:?{task_status}"? ? ? ? result["responsible"] = get_table_owner(table_name)? ? ? ? result["suggested_action"] =?"檢查任務(wù)日志"? ? ? ??return?result? ??# 2. 檢查上游數(shù)據(jù)? ? upstream_tables = get_upstream_tables(table_name)? ??for?upstream?in?upstream_tables:? ? ? ? upstream_status = check_data_quality(upstream, date)? ? ? ??ifnot?upstream_status["healthy"]:? ? ? ? ? ? result["status"] =?"upstream_issue"? ? ? ? ? ? result["root_cause"] =?f"上游表?{upstream}?數(shù)據(jù)異常:?{upstream_status['issue']}"? ? ? ? ? ? result["responsible"] = get_table_owner(upstream)? ? ? ? ? ? result["impact"] = get_downstream_impact(table_name)? ? ? ? ? ? result["suggested_action"] =?f"聯(lián)系?{result['responsible']['name']}?處理上游問題"? ? ? ? ? ??return?result? ??# 3. 檢查數(shù)據(jù)邏輯? ? logic_issue = check_business_logic(table_name, date)? ??if?logic_issue:? ? ? ? result["status"] =?"logic_error"? ? ? ? result["root_cause"] =?f"數(shù)據(jù)邏輯異常:?{logic_issue}"? ? ? ? result["responsible"] = get_table_owner(table_name)? ? ? ? result["suggested_action"] =?"檢查ETL代碼邏輯"? ? ? ??return?result? ??# 4. 無法診斷? ? result["status"] =?"unknown"? ? result["suggested_action"] =?"人工排查"? ??return?resultdef?get_table_owner(table_name):? ??"""從元數(shù)據(jù)獲取責(zé)任人信息"""? ? sql =?f"""? ? ? ? SELECT owner, oncall_contact, business_scene? ? ? ? FROM meta_critical_tables? ? ? ? WHERE table_name = '{table_name}'? ? """? ? row = execute_sql(sql)? ??return?{? ? ? ??"name": row["owner"],? ? ? ??"contact": row["oncall_contact"],? ? ? ??"business": row["business_scene"]? ? }def?get_downstream_impact(table_name):? ??"""評估下游影響"""? ? sql =?f"""? ? ? ? SELECT downstream_count, business_scene? ? ? ? FROM meta_critical_tables? ? ? ? WHERE table_name = '{table_name}'? ? """? ? row = execute_sql(sql)? ??return?{? ? ? ??"downstream_count": row["downstream_count"],? ? ? ??"business_impact": row["business_scene"]? ? }# 使用示例if?__name__ ==?"__main__":? ? result = diagnose_table_issue("dws_order_trade_1d",?"2024-12-16")? ? print(f"""? ? 【自動診斷結(jié)果】? ? 表名:?{result['table']}? ? 狀態(tài):?{result['status']}? ? 根因:?{result['root_cause']}? ? 責(zé)任人:?{result['responsible']['name']}?({result['responsible']['contact']})? ? 建議操作:?{result['suggested_action']}? ? 影響范圍:?{result['impact']}? ? """)
3. 元數(shù)據(jù)快速查詢頁面(Flask)
#!/usr/bin/env python3"""輕量級元數(shù)據(jù)查詢API"""from?flask?import?Flask, request, jsonifyapp = Flask(__name__)@app.route('/api/table/<table_name>', methods=['GET'])def?get_table_info(table_name):? ??"""查詢表元數(shù)據(jù)"""? ? sql =?f"""? ? ? ? SELECT? ? ? ? ? ? table_name,? ? ? ? ? ? table_desc,? ? ? ? ? ? owner,? ? ? ? ? ? oncall_contact,? ? ? ? ? ? business_scene,? ? ? ? ? ? sla_time,? ? ? ? ? ? critical_upstream,? ? ? ? ? ? downstream_count? ? ? ? FROM meta_critical_tables? ? ? ? WHERE table_name = '{table_name}'? ? """? ? result = execute_sql(sql)? ??ifnot?result:? ? ? ??return?jsonify({"error":?"表不存在或不是核心表"}),?404? ??return?jsonify(result)@app.route('/api/search', methods=['GET'])def?search_tables():? ??"""搜索表"""? ? keyword = request.args.get('q',?'')? ? sql =?f"""? ? ? ? SELECT table_name, table_desc, owner, business_scene? ? ? ? FROM meta_critical_tables? ? ? ? WHERE table_name LIKE '%{keyword}%'? ? ? ? ? ?OR table_desc LIKE '%{keyword}%'? ? ? ? ? ?OR business_scene LIKE '%{keyword}%'? ? ? ? LIMIT 20? ? """? ? results = execute_sql(sql)? ??return?jsonify(results)if?__name__ ==?'__main__':? ? app.run(host='0.0.0.0', port=8080)

如果這篇文章對你有啟發(fā),歡迎轉(zhuǎn)發(fā)分享!
(部分內(nèi)容來源網(wǎng)絡(luò),如有侵權(quán)請聯(lián)系刪除)