ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

华为数据治理落地实践:信息架构、数据底座与指标口径统一

华为数据治理落地实践:信息架构、数据底座与指标口径统一 简介这份PDF资料围绕华为数据之道展开面向数据治理从业者、企业数据中台建设者以及希望系统理解数据管理方法的技术人员帮助读者建立从数据采集、存储、处理到分析应用的整体认知框架。资源为单个PDF文件压缩包约4.8MB内容以文字与案例链接为主便于在电脑或移动端随时查阅。目前已有8067人学习下载具备一定的参考热度。资料中涉及数据治理、数据中台、数据资产变现、大数据应用案例、数据发展蓝皮书及DTiii大数据产业地图等核心知识点并串联了金融、电信、媒体、医疗、旅游等多个行业的大数据实践案例同时提及阿里、滴滴等企业的数据中台建设思路与中台报告相关内容。读者可借此梳理华为数据之道的方法论脉络理解数据中台的职责定位与建设路径并对照行业案例思考数据资产变现的落地方式适合作为数据治理入门与进阶的参考读物。1. 从一份 PDF 说起华为数据治理到底在解决什么问题很多团队第一次翻《华为数据之道》的学习分享 PDF期待的是拿到一套“照抄就能上线”的模板结果发现里面大量篇幅在讲信息架构、数据底座、数据消费这些看起来偏“务虚”的东西。真正做过数据治理的人反而会有共鸣数据治理失败的项目几乎都不是败在工具选型而是败在“没人说得清一张表该归谁管、一个指标该信哪个版本”。这份分享材料真正有价值的地方是它把华为内部多年沉淀的方法论拆成了可落地的分层结构——信息架构、数据底座、数据服务、数据消费每一层都有明确的职责边界和交付物。它适合正在搭数据中台、被指标口径打架折磨的数据工程师也适合需要向管理层解释“为什么治理要先做架构再做平台”的技术负责人。下面按“架构怎么立、底座怎么搭、服务怎么出、消费怎么管”的顺序把这份材料里能直接抄作业的部分拆开讲。2. 信息架构先行数据资产目录与数据标准的落地方法2.1 为什么先做信息架构而不是先买平台华为数据之道里反复强调一个顺序先定义“数据长什么样”再决定“用什么存”。信息架构的核心产出是三样东西——数据资产目录、数据标准、数据模型。数据资产目录回答“企业有哪些数据”数据标准回答“同一个字段在不同系统里叫什么、什么类型、什么取值范围”数据模型回答“这些数据之间怎么关联”。如果跳过这一步直接上平台最常见的后果是三个系统里都有“客户编号”一个是 varchar(20)、一个是 bigint、一个是带前缀的字符串做关联查询时全靠 cast 硬转性能和数据质量双输。我一般会建议团队先用一张 Excel 把核心业务实体的属性梳理出来再导入元数据管理工具。梳理的粒度控制在“业务对象 关键属性”这一层不要一上来就追求全字段覆盖否则梳理周期会拖到项目黄掉。2.2 数据资产目录的字段设计与建表数据资产目录本质上是一张元数据表记录每个数据资产的归属、责任人、更新频率、敏感级别。下面是一个可以直接用的建表语句字段参考了常见做法-- 数据资产目录主表 CREATE TABLE meta_data_asset ( asset_id BIGINT PRIMARY KEY COMMENT 资产唯一ID, asset_name VARCHAR(128) NOT NULL COMMENT 资产中文名如“客户主数据”, asset_name_en VARCHAR(128) COMMENT 资产英文名用于程序引用, domain_name VARCHAR(64) NOT NULL COMMENT 所属数据域如“客户域”, owner_dept VARCHAR(64) NOT NULL COMMENT 责任部门, owner_person VARCHAR(64) COMMENT 数据责任人Data Owner, steward_person VARCHAR(64) COMMENT 数据管家Data Steward, source_system VARCHAR(64) COMMENT 来源系统如 CRM、ERP, update_freq VARCHAR(16) COMMENT 更新频率实时/日/周/月, security_level TINYINT DEFAULT 1 COMMENT 敏感级别 1-公开 2-内部 3-秘密, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) COMMENT 数据资产目录;这段建表的关键点在于domain_name和owner_person两个字段。数据域是华为方法论里划分治理边界的核心单位通常按业务主题划分客户域、产品域、交易域等一个域对应一个数据责任人。security_level用整型而不是枚举是为了后续做权限策略时方便做数值比较。实际落地时asset_name建议加唯一索引避免同一个资产被不同部门重复登记。2.3 数据标准的定义与校验规则数据标准不是写一份 Word 文档就完事它必须能被程序读取和校验。常见做法是把标准定义成一张表然后在数据接入环节做自动比对# 数据标准校验示例检查源字段是否符合已登记标准 import re STANDARDS { customer_id: {type: string, pattern: r^C\d{10}$, desc: 客户编号C10位数字}, phone: {type: string, pattern: r^1[3-9]\d{9}$, desc: 手机号}, amount: {type: decimal, min: 0, max: 99999999.99, desc: 金额两位小数}, } def validate_field(field_name, value): std STANDARDS.get(field_name) if not std: return True, 未登记标准跳过校验 if std[type] string: if not re.match(std[pattern], str(value)): return False, f{field_name} 不符合标准{std[desc]} elif std[type] decimal: v float(value) if v std[min] or v std[max]: return False, f{field_name} 超出范围 [{std[min]}, {std[max]}] return True, 校验通过STANDARDS字典是标准的程序化表达validate_field在数据接入时逐字段调用。参数说明pattern用正则描述格式约束min/max描述数值边界。实际项目中这套规则会存到数据库或配置中心而不是硬编码在代码里但逻辑是一样的。校验失败的数据不应该直接丢弃而是写入一张异常表附带失败原因和原始值方便后续人工修正。注意数据标准一旦发布就不要频繁改每次变更都要走版本管理否则下游已经按旧标准清洗过的数据会和新数据对不上。3. 数据底座搭建从贴源层到主题层的分层建模3.1 分层建模的职责划分华为数据之道里的数据底座通常分四层贴源层ODS、整合层DWI、主题层DWS、应用层ADS。贴源层保持和源系统一致不做清洗整合层做标准化和去重主题层按业务主题做宽表聚合应用层直接面向报表和接口。分层的意义在于任何一层出问题可以单独重跑不会牵一发动全身。层级职责更新频率典型存储ODS原样接入保留历史实时/小时Hive/ClickHouseDWI清洗、标准化、去重日HiveDWS主题宽表、轻度聚合日Hive/DorisADS指标计算、接口输出小时/实时Doris/MySQL这张表是我在多个项目里验证过的分层配置ODS 层用 ClickHouse 做实时接入、DWI 以上用 Hive 做批量加工是成本和性能比较平衡的组合。如果团队规模小ODS 和 DWI 可以合并但 DWS 和 ADS 建议保留因为这两层的消费模式差异很大。3.2 整合层去重的 SQL 实现整合层最常见的操作是去重。以客户表为例同一个客户在 CRM 和 ERP 里各有一条记录需要按客户编号合并-- DWI 层客户去重按 customer_id 分组取更新时间最新的一条 INSERT OVERWRITE TABLE dwi_customer SELECT customer_id, -- 用 row_number 按更新时间倒序取第一条 max(customer_name) AS customer_name, max(phone) AS phone, max(update_time) AS update_time FROM ( SELECT customer_id, customer_name, phone, update_time, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY update_time DESC) AS rn FROM ods_customer WHERE customer_id IS NOT NULL ) t WHERE rn 1 GROUP BY customer_id;ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY update_time DESC)是去重的核心按客户编号分组组内按更新时间倒序编号rn 1就是最新那条。外层再套一层GROUP BY是为了处理极端情况下同一客户编号有多条相同更新时间记录的情况。参数上PARTITION BY的字段必须是业务主键ORDER BY的字段决定保留哪条通常用更新时间或数据来源优先级。3.3 主题层宽表的构建策略主题层宽表是把多个整合层表按业务主题关联起来比如“客户主题宽表”需要关联客户基本信息、订单汇总、最近登录时间等。构建时要注意两点一是关联字段必须已经标准化二是宽表不要追求“大而全”按消费场景拆成多个宽表比一张几百列的宽表更好维护。常见做法是按“客户 交易”“客户 行为”分别建宽表而不是全部塞进一张。4. 数据服务与消费指标口径统一与数据资产变现4.1 指标口径统一的元数据管理数据消费环节最大的痛点是同一个指标在不同报表里算法不一样。华为数据之道的做法是建一张指标元数据表把每个指标的计算逻辑、责任人、适用场景登记清楚CREATE TABLE meta_indicator ( indicator_id BIGINT PRIMARY KEY, indicator_name VARCHAR(128) NOT NULL COMMENT 指标中文名如“月活跃客户数”, indicator_code VARCHAR(64) NOT NULL COMMENT 指标编码程序引用, calc_logic TEXT NOT NULL COMMENT 计算逻辑SQL 片段或公式, source_table VARCHAR(256) COMMENT 来源表, owner_person VARCHAR(64) COMMENT 指标责任人, biz_scene VARCHAR(128) COMMENT 适用业务场景, version VARCHAR(16) DEFAULT v1 COMMENT 版本号 ) COMMENT 指标元数据;calc_logic字段存的是可执行的 SQL 片段比如COUNT(DISTINCT customer_id) WHERE login_date date_sub(current_date, 30)。这样任何报表要算这个指标都从这张表里取逻辑而不是各自写各自的。version字段用于指标逻辑变更时保留历史版本避免旧报表突然算不出数。4.2 数据资产变现的接口封装数据资产变现的本质是把治理好的数据通过接口输出给业务方。常见做法是用统一的 API 网关封装 ADS 层表业务方按指标编码调用# 指标查询接口示例按指标编码返回计算结果 from flask import Flask, request, jsonify import pymysql app Flask(__name__) app.route(/api/indicator/indicator_code, methods[GET]) def get_indicator(indicator_code): # 从元数据表取计算逻辑 conn pymysql.connect(hostmeta-db, userreader, password***, databasemeta) with conn.cursor() as cur: cur.execute(SELECT calc_logic FROM meta_indicator WHERE indicator_code%s, (indicator_code,)) row cur.fetchone() if not row: return jsonify({error: 指标不存在}), 404 # 执行计算逻辑实际项目应做 SQL 白名单校验 with conn.cursor() as cur: cur.execute(fSELECT {row[0]} AS value) result cur.fetchone() return jsonify({indicator: indicator_code, value: result[0]})这个接口的关键设计是“逻辑与执行分离”指标逻辑存在元数据表里接口只负责取逻辑并执行。参数说明indicator_code是路径参数对应meta_indicator表的indicator_code字段。实际生产环境必须对calc_logic做白名单校验防止 SQL 注入这里为了演示省略了。返回结构里带上指标编码方便调用方做缓存和日志追踪。4.3 数据消费的权限与审计数据消费不是开放得越广越好。华为方法论里强调按security_level做分级授权公开级数据可以直接接口输出内部级需要申请秘密级必须脱敏。审计方面每次接口调用都要记录调用方、指标编码、返回行数、耗时写入一张审计表。这张表不用太复杂但必须能回答“谁在什么时候查了什么数据”这个问题否则出了数据泄露事件根本查不到源头。5. 治理落地的验证与排错从元数据一致性到血缘追踪5.1 元数据一致性校验脚本治理做得好不好先看元数据准不准。最常见的元数据问题是“资产目录里登记的表在数据库里不存在”或“数据库里有的表没登记”。下面这个脚本用来做双向比对# 元数据一致性校验比对资产目录与实际库表 import pymysql def check_consistency(meta_conn, db_conn): # 取资产目录里登记的表名 with meta_conn.cursor() as cur: cur.execute(SELECT asset_name_en FROM meta_data_asset WHERE source_systemHive) registered {row[0] for row in cur.fetchall()} # 取 Hive 元数据库里实际存在的表 with db_conn.cursor() as cur: cur.execute(SHOW TABLES) actual {row[0] for row in cur.fetchall()} # 双向差集 missing_in_db registered - actual # 登记了但库里没有 missing_in_meta actual - registered # 库里有但没登记 return missing_in_db, missing_in_meta if __name__ __main__: meta pymysql.connect(hostmeta-db, userreader, password***, databasemeta) hive pymysql.connect(hosthive-metastore, userreader, password***, databasemetastore) a, b check_consistency(meta, hive) print(登记了但库里没有:, a) print(库里有但没登记:, b)registered - actual和actual - registered两个差集分别对应两类问题。第一类通常是表被删了但目录没更新第二类是新建表没走登记流程。建议把这个脚本挂到定时任务里每天跑一次结果推给数据管家。参数上source_system用来过滤特定来源系统避免跨系统比对产生噪音。5.2 数据血缘追踪的实现思路血缘追踪回答“这个指标的数据从哪来”。实现方式通常是在 ETL 任务里埋点记录每次加工的输入表和输出表-- 血缘关系表 CREATE TABLE meta_lineage ( lineage_id BIGINT PRIMARY KEY AUTO_INCREMENT, job_name VARCHAR(128) COMMENT ETL 任务名, source_table VARCHAR(256) COMMENT 输入表, target_table VARCHAR(256) COMMENT 输出表, transform_type VARCHAR(32) COMMENT 加工类型清洗/关联/聚合, run_time DATETIME COMMENT 执行时间 );每次 ETL 任务执行时往这张表插一条记录source_table和target_table支持逗号分隔的多表。查询某个指标的血缘时从target_table反查source_table再递归往上查就能画出完整链路。实际项目中血缘数据量会很大建议按run_time做分区只保留最近 90 天。5.3 常见治理失败的排查清单治理项目推不动通常不是技术问题。我整理过一份排查清单按优先级排序第一数据责任人是不是真的在业务部门有话语权如果只是挂名治理推不动第二指标口径变更有没有通知机制很多冲突是因为变更没同步第三元数据登记是不是变成了额外负担如果登记流程比写代码还麻烦没人会认真填第四数据质量问题的修复有没有闭环发现了问题但没人改下次就没人报了。这四条里任何一条出问题工具再好也救不回来。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进