一、实时数仓分层规范
1.1 分层需求分析
建设实时数仓的目的,主要是增加数据计算的复用性。每次新增加统计需求时,不至于从原始数据进行计算,而是从半成品继续加工而成。
我们这里从 loghub、kafka 的 ods 层读取用户行为日志以及业务数据,并进行简单处理,写回到 kafka、hologres 作为 dwd 层。
1.2每层的职能
分层 | 数据描述 | 生成计算工具 | 存储媒介 |
ODS | 原始数据,日志和业务数据 | Kafka LogHub | |
DWD | 根据数据对象为单位进行分流,比如订单、页 面访问等等。 | FLINK | Kafka Hologres |
DIM | 维度数据 | FLINK | Kafka Hologres |
DWS | 根据某个维度主题将多个事实数据轻度聚合, 形成主题宽表。 | FLINK | Kafka Hologres |
DM | 把 Kafka Hologres中的数据根据可视化需要进行筛选聚合。 | FLINK | 可视化展示 |
v ODS (LogHub、kafka、DataHub)
原始数据,日志和业务数据
v DWD(kafka、Hologres)
根据数据对象为单位进行分流,比如订单、页面访问等等
v DIM(Hologres)
维度数据
v DWS (kafka、Hologres)
根据某个主题将多个事实数据轻度聚合,形成主题宽表。
v ADS (Hologres)
把 Hologres中的数据根据可视化需要进行筛选聚合
1.3分层命名规范
对数据架构各个分层的数据管理,需要建设相应的数据库。阿里云采用一个项目空间管理,分库按照表名前缀进行逻辑划分。
注:[]:可选项,可以省略
- 源数据层(ODS)的命名规范如下:
分层 | 数据模型命名 | 命名规范 | 开发目录 LogHub、Kafka、hologres | 备注 |
---|---|---|---|---|
源数据层(ODS) | ods_kafka/sls/cdc+_+…… | 日志表:soyoung_dw.ods_sls/kafka+_+数据来源名|主题名+_+ 自定义表名+_+(周期后缀) | LogHub、Kafka | 案例:ods_sls_md_xcx_axm_log_rt |
- 数据仓库层(DW)的命名规范如下:
分层 | 数据模型命名 | 命名规范 | 实时开发目录 | 备注 |
---|---|---|---|---|
明细数据层(DWD) | dwd+_+…… | dwd_数据输出源_{主题域名[_二级主题名]}_{自定义表名}_{周期后缀} | 阿里云实时计算Flink平台 | 案例:dwd_md_xcx_axm_log_rt |
汇总数据层(DWS) | dws+_+…… | dws_数据输出源_{主题域名[_二级主题名]}_{自定义表名}_[summary|topic]_{周期后缀} | 阿里云实时计算Flink平台 | summary:按照多维度聚合 topic:按照1个维度聚合 案例:dws_md_xcx_axm_log_rt |
维度数据层(DIM) | dim+_+…… | dim_{维度名}_{info}_{周期后缀} | 阿里云实时计算Flink平台 | dim_{维度名}_{info}_{周期后缀} |
- 数据集市层(DM)的命名规范如下:
分层 | 数据模型命名 | 命名规范 | DataWorks开发目录 | 备注 |
---|---|---|---|---|
集市层(DM) | dm_+_+……(平台组) dm_saas+_+……(商家组) dm_business+_+……(交易组) dm_content+_+……(内容组) | 阿里云实时计算Flink平台/dm/…… 阿里云实时计算Flink平台/dm/dm_saas/…… 阿里云实时计算Flink平台/dm/dm_business/…… 阿里云实时计算Flink平台/dm/dm_content/…… | soyoung_dw.dm_{主题域名[_二级主题名]|专题}_{自定义表名}_{周期后缀} |
- 临时表(tmp)与视图命(view)命名规范如下:
分层 | 数据模型命名 | 命名规范 | DataWorks开发目录 | 备注 |
---|---|---|---|---|
临时表 | 作业中:表名后统一加"_tmp[_01]" 临时需求:tmp_…… | 阿里云实时计算Flink平台 | 临时表不定期清理:drop或删数据 | |
视图 | 表名后统一加"_view" | 阿里云实时计算Flink平台 | 应用场景kylin数据表等 |
1.4表命名规范
1.4.1整体原则
- 表名字要求采用小写
- 作业名同表名一致
- 周期后缀:标识增全量、调度周期:
周期后缀标识 (增全量、调度周期) | 解释 |
---|---|
_rt | 实时增量 |
"_all_rt" | 实时全量 |
1.5字段规范
1.5.1命名规范:
- 原则:字段名尽量详细,易于理解
- 小写:表的字段名字要求采用小写
- 继续使用原业务系统字段:字段数据、意义没有改变时,原则上,可以使用原业务系统字段名字
- 英文字段名组成:[is]_[修饰词]+字段描述词+[后缀/度量]+[时间周期词],强烈建议保留后缀
- 中文名组成:[时间周期词]+[修饰词]+字段描述词+[度量]
- 必须以字母开头
- 字段名由字母、下划线、数字组成
- 字段英文名长度尽量控制在30个字符以内
- 表示是否的字段,用is_含义, 例如,deal是否可预订,is_apt、is_prepay等。
业务含义是动词时,尽量不用使用其分词命名,如is_paid,应为is_pay
定义:是(1)非(0)或 肯(1)否(0),存0、1 - 基础字段命名:用num, amt, cnt, id, type等简写做后缀,如”order_cnt”表示订单数量,“product_id”标示产品ID
- DW内部:相同含义的字段名称、数据类型在正常情况下须保持一致,减少使用过程中的混淆,避免造成数据流转时不能被抽取或数据截断情况
1.5.2分区字段命名规范
- 时间分区命名:
分区名统一命名为dp,格式统一要求(ods_db前缀的表分区名pt,由于阿里产品原因):
分区类型 | 分区名及格式 | 备注 |
---|---|---|
日分区 | dp=yyyy-mm-dd | |
月分区 | dp=yyyy-mm | |
小时分区 | hh=00..23 | 第一个小时00,最后小时23 |
分钟分区 | hhmm=0000..2350 | 10分钟举例 |
1.5.3字段类型
- 字段类型只使用以下几种:
int 数量、次数、人数等整数字段
bigint 数量、次数、人数等整数字段
double 金额、比率等小数字段
string 订单编号、SKU编号、描述类信息、日期等字符字段
- 不使用比int小的数字类型
- 不使用unsigned
二、实时数仓架构设计
-
阿里云技术产品及选型
v 数据采集传输:EMSKafka、DataHub、LogHub、DTS
v 数据存储:RDS、AnalyticDB、Hologres
v 数据计算:FlinkSql、JavaFlink
v 数据可视化:DataV
- 普通实时计算与实时数仓比较
普通的实时计算优先考虑时效性,所以从数据源采集经过实时计算直接得到结果。如此做时效性更好,但是弊端是由于计算过程中的中间结果没有沉淀下来,所以当面对大量实时需求的时候,计算的复用性较差,开发成本随着需求增加直线上升。
实时数仓基于一定的数据仓库理念,对数据处理流程进行规划、分层,目的是提高数据的复用性。
3. 系统架构设计
4.业务流
重点思考:
问:FlinkSQL 是如何解决双流 Join 的问题,会不会出现时间错位而未关联的情况?
答:FlintkSQL 是一种有状态的流式计算,流中的数据会被以状态的形式保存起来,所
以即使两个流中的数据有一定的延迟,也可以利用状态关联出来。
问:这个状态保存多久?
答:阿里云中 FlinkSQL 的状态数据默认保存 36 个小时。