数据仓库建设规范(全)
The following article is from 数仓与大数据 Author otw30
福利:文末赠送「数据科学」正版书籍*4本,抽奖可直接滑到文末!
正文
导读:我们讲解过数仓规范的重要意义,以及企业落地数仓规范的标准流程。详见:
如果能完全按照上面中的流程落地,就能够保障数仓建设、迭代的整体质量。
在实际操作中往往会事不由人,但是基于规范的重要性,有些事情我们还是必须要要去做的。
如果你是管理者,就要定期的抽查团队成员的工作产出、发现问题及时更正、对入职新人前期的重点关注等等。
如果你是一线开发,应该对自己有所约束。如果团队整体混乱,管理者对规范又不太重视,那么调整心态、适应环境就好,切不可因此与同事发生冲突,圈子很小大家以和为贵嘛。
在上篇内容中有说过如今网络上流传的数仓规范,碎片化严重。
本篇,我会根据过往实践经验,结合网络文章,尽量给大家提供一套完整的规范范本,供大家学习参考。
01
—
数仓规范有哪些?
为了让大家了解到数仓规范全貌,特意花大力气整理出以上分类。欢迎大家推广普及运用。由于只是一家之言,大家如有不同的见解、更好的方案或者有可以再补充的,欢迎拉到文章底部,加我微信,大家共同研究。
这里,我把数仓规范,一共分为四大类:设计规范、流程规范、质量管理规范、安全规范。
设计规范,又划分为四部分:数据模型设计、命名规范、指标体系设计、词根库。
流程规范,主要是从数仓管理的角度,对数仓场景下的各种流程进行约束。核心流程一共提炼出来五类:需求提交、模型设计、ETL开发、前端开发、上线流程。
质量管控规范,之所以单独列出来,是因为数据质量,跟模型设计一样,对数仓建设的成败关系极大。试想下,一个数据质量都无法保证的数据仓库,有谁会用? 数据质量规范,主要是从数据流动的角度分为三类:源端管控、数仓管理、应用管控。
安全规范,随着国家、社会、企业对数据的越来越重视,另一方面随着互联网的普及使得个人隐私变的越来越难以保证,数据泄露时有发生。数据安全对于数据仓库的重要程度急速提升,所以安全规范被单列了出来。从大的层面上安全规范分为三类:网络安全、账号安全、数据安全。
02
—
设计规范
数据模型设计
说明
分层设计是数据架构设计的产出之一,在模型设计环节做为强制规范遵守。
分层规范
ODS
贴源层,原始数据不做变化或者仅做最简单的补全后存入。 数据域划分,依据是数据源。
DWD
对数据源做清洗、转换、补全、编码转换后加载到明细数据层。 数据域划分,依据参考下边的纵向分域。
DWS
汇总数据层+主题宽表。 数据域划分,依据参考下边的纵向分域。
ADS
应用层,面向最终应用。 主题域划分,依据是最终应用。生命周期也与应用同步。
层次调用规范
禁止反向调用 ODS 只能被 DWD 调用。 DWD 可以被 DWS 和 ADS 调用。 DWS 只能被 ADS 调用。 数据应用可以调用 DWD、DWS、ADS,但建议优先考虑使用汇总度高的数据。 ODS->DWD->DWS>ADS ODS->DWD->ADS
定义
主题域通常是联系较为紧密的数据主题的集合,方便寻找和使用数据。
基本原则
高内聚、低耦合。 数量不能太多。建议不超过十个。 必须保持稳定。既能涵盖当 前所有的业务需求,又能在新业务进入时无影响地被包含进已有的数据域中或扩展新的数据域。 需要结合团队和业务的实际情况,比如业务是否稳定、团队成员建模水平等。 适度的抽象。太低不好适应变化,太高不易于理解使用。
分类
数据/业务主题域
依据业务流程划分,实现相对容易。
分析主体域
面向分析场景,实现较难,对业务理解、抽象能力等要求高。
划分依据
按照业务或业务过程划分:比如一个靠销售广告位置的门户网站主题域可能会有广告域,客户域等,而广告域可能就会有广告的库存,销售分析、内部投放分析等主题。 根据需求方划分:比如需求方为财务部,就可以设定对应的财务主题域,而财务主题域里面可能就会有员工工资分析,投资回报比分析等主题。 按照功能或应用划分:比如微信中的朋友圈数据域、群聊数据域等,而朋友圈数据域可能就会有用户动态信息主题、广告主题等。 按照部门划分:比如可能会有运营域、技术域等,运营域中可能会有工资支出分析、活动宣传效果分析等主题。
高内聚和低耦合 核心模型与扩展模型分离
公共处理逻辑下沉及单一 成本与性能平衡
数据可回滚 一致性
命名清晰、可理解
维表:创建时间、更新时间 事实表:ETL 日期、更新时间
表、字段的备注信息,必须言简意赅,在描述清楚的前提下尽量简洁。 字段类型的约束:比如字符串用 String,数值用 Int,年月日都用 String 比如 yyyyMMdd 等。
采用蛇形命名法,即采用一个下划线分隔词根。 优先使用词根中已有关键字(数仓标准配置中的词根管理),定期 Review 新增命名的不合理性。
禁止采用非标准的缩写。 命名一律采用小写,只能以字母开头。
命名不宜过长。
表
分层-分域-分词根-分时间周期 正式表,所在层级名称+数据域+表描述+时间周期或加载策略,如增量、快照、拉链/小时、日、周、月、季、年 中间表,对应正式表+_mid+阿拉伯数字 临时表,z+创建者姓名检查+表名
视图
参照表命名规范+_v
字段
优先从词根中取,多次出现的要增加到词根库
任务
与目标表名相同
指标
原子指标
业务修饰词 + 词根
衍生指标
原子指标+时间周期(可选)
派生指标
一个原子指标+多个修饰词(可选)+时间周期
脚本是否有备注、复杂计算逻辑是否有注释释。 任务是否支持多次重跑而输出不变,不能有 insert into 语句。
分区表是否使用分区键过滤并且有有效裁剪。 外连接的过逑条件是否使用正确,例如在左连接的 where 语句存在右表的过滤条件。
关联小表,是否使用/*+ map join * /。 不允许引用别的计算任务临时表。
原则上不允许存在一个任务更新多个目标表。 是否存在笛卡尔积。 禁止在代码里面使用 drop、create、rename 等 DDL 语句。 使用动态分区时,有没有检查分区键值为 NULL 的情况。 对于重要的任务 DQC 质量监控规则是否配置,严禁裸奔。 代码中有没有进行适当的规避数据倾斜语句。
指标层级划分方式
按分析主题
一级分类 二级分类
按业务过程
一级分类 二级分类 三级分类
指标定义
内容
所属分类 指标类别 名称 描述 口径/算法 计量单位 适用维度 ...
原则
唯一性 可扩展 易理解
类别
原子指标(某一业务事件行为下的度量,不可再拆分的指标) 例如:订单金额 衍生指标(对原子指标进行四则运算) 派生指标(统计周期+统计粒度+业务限定+原子指标)例如:最近一天+新创建的+订单个数(阿里大数据之路对于派生指标的定义:派生指标=原子指标+时间周期修饰词+其它修饰词。唯一归属于某一个原子指标,继承原子指标的数据域)
说明:网上对于指标分类说法不统一,大家知道咋回事儿就行了。搜了一下阿里的大数据之路,没有衍生指标的概念。说法一:衍生指标=派生指标。那么用我上边派生指标的定义即可。说法二:衍生指标是对原子指标进行四则运算得到的。那么衍生指标就是原子指标增加减少几个修饰词或者时间周期扩大缩小后得到的。所以感觉衍生指标有点鸡肋搞不好就变成原子/派生指标了。
指标管理流程
指标新增申请 初审:明确指标口径,检查指标库是否包含 二审:审核指标定义需要的各项元素是否准确完备 入指标库
定义
把可能会多次用到的短语,集中命名,保证全局范围内的命名含义一致性。
内容
所属分类 名称 英文简称 数据类型 备注
分类
普通词根:描述事物的最小单元体,如:交易-trade。 专有词根:具备约定成俗或行业专属的描述体,如:美元-USD。
公共字段
公共字段=词根组合+其它关键词 公共字段放入词根库不太严谨,但字段命名时候可以直接取用,降低了命名不一致的风险,所以工具化不太完善的公司推荐这样使用。
03
—
流程规范
需求提交流程
提出需求
需求提出人:以文档的形式提出需求(写清楚需求内容、交付物、期望交付日期),发给数仓 Leader。
沟通需求
数仓 Leader 将需求分配给相关人承接,同时协商好实际交付日期。
如果需求提出人的交付日期与数仓 Leader 的交付日期不一致,双方需要进一步协商一致。
开发交付
需求承接人,需按照协商一致的交付日期,按期交付。
模型设计流程
数据调研、业务调研、需求调研
数据建模
总体思路
根据已有的分层分域,分治、各个击破。
多种方式结合使用
确定业务过程->声明粒度->确定维度->确定事实
业务建模->逻辑建模->物理建模
构建总线矩阵
构建指标体系
评审
除了模型设计,还需要拉上必要的开发、业务、分析师、产品经理、数仓运维等。
上线、迭代、完善
ETL开发流程
(这个在后续章节-ETL篇-会详细介绍)
需求理解
数据探查
程序开发
流程依赖
配置调度
前端开发规范
(这个在后续章节-应用篇-会详细介绍)
接口规范
代码部署规范
上线流程
申请
上线时间
上线功能范围
对其它模块、上下游依赖的影响
上线支持团队清单
上线详细操作步骤
测试报告
回滚方案
评审
代码 Review
上下游影响分析
上线
上线支持团队就绪
严格按照上线操作步骤执行
失败回滚
04
—
质量管控规范
源端变动,必须提前通知数仓侧。 有条件的话,使用工具监控源端重点内容的变动。
对已有规范没有贯彻的给予警告、处罚:建模规范、开发规范、上线规范 使用工具加强数据质量监控,发现问题及时通知、告警。
建立数据质量解决机制,责任到人。 定期复盘
重要常见问题入告警规则 源端数据质量问题,协调源端解决 存储模型、ETL开发、上线流程等引起的问题,需要制定合适的解决方案
统一指标定义 统一指标口径
统一外部数据输出归口
05
—
安全规范
网络安全
内外网隔离,外网环境访问内网需要登录 VPN 核心数据存储、功能模块,只开放给特定的少部分人。
账号安全
每个人分配独立的账号,赋予合理的权限,禁止相互借用。 数据库、大数据组件开通多个角色账号。比如只读、部分表读写、管理员等。当然还可以按实际需求细分。Hive、ODPS 的话也是可以实现单人单号的。
服务器登录。也是单人单号 公司内部应用账号。单人单号。
数据安全
至少做到表级别的权限控制,实在不行就分库。 ODS 层不对外开放,只对 ODS-DWD 层相关部分开发人员可见。
特别敏感数据,如用户年龄、号码、身份证好、地址等,应该放到专门的数据库里,数仓主库只存放用户 ID 和其它必须字段。例如年龄应该脱敏成年龄区间或开发特定的 UDF 转化函数。
06
—
总结
在我经历过的几家公司、好多个项目里,也没有哪个项目完整的使用过以上所有规范,互联网大数据公司比之前的传统数仓项目用到的规范还更少些而且侧重点也不太一样。大数据公司可能由于互联网基因吧,更加侧重数据安全、工具化等,对数据质量、数据模型等要求不太高。而传统数仓对数据建模、数据质量的要求很高(我有一位同事,曾因为一块钱,被甲方财务主管扣下,对了一整天的数据~),内网环境数据安全被提的不是很多,另外可能是由于做项目的原因吧,工具化不太被人关注,管理基本靠人治,元数据基本靠文档。(意犹未尽的赶脚~)
点击上面文字即可跳转专题
还想看更多?
戳下面查看更多干货👇
万字长文详解HiveSQL执行计划
蚂蚁金服-数据仓库高级工程师面试
Spark面试题汇总及答案(推荐收藏)
赠书环节
送书环节来了~
可点击上图了解及购买
公众号回复“077”,参与抽奖。
《数据科学》
扫一扫回复:“077”