伴鱼离线数仓建立,与伴鱼的业务一起快速发展,从一条业务线,到多条业务线。在演进的过程中,有很多总结和沉淀的内容。本篇文章主要介绍伴鱼离线数据仓库的发展历史,在发展过程中遇到的各种问题,以及针对问题的解决方案。
首先介绍伴鱼的主要业务线,流量型产品:伴鱼绘本,业务型产品:伴鱼AI课,伴鱼少儿英语等十几条业务线:
由于各个业务线有互相交叉的部分,比如:数学业务使用少儿业务的班主任作为销售售卖课程、业务线之间也可以互相引流等。导致实体数据之间的关系复杂度较高。
在伴鱼数据仓库部门主要的工作内容:
在伴鱼数仓建设之前,数据部门会给各个业务线提供数据支持,当时的业务需求比较少,内容和形式也相对简单。
当时的做法:
以上数据支持流程足以应对当时业务不太复杂的伴鱼公司,但是随着公司的发展和业务线的增加,对数据的需求量以及需求复杂度都在增加和提高,以上流程的开发效率就显得捉襟见肘,主要体现在以下问题:
为了解决以上问题伴鱼开始构建自己的数据仓库。
2019年Q3之前,整体数据情况是:数据体量小,团队人员不足,底层表调整频繁,业务灵活多变,要求响应速度快。建设目标:快速响应需求,以最少的人力支持全公司的业务决策需求。基于当时的背景和目标,数仓架构主要是基于 TIBD 构建的3层数仓结构,原始数据层、base 层、stat 层。数据整体架构如下图:
数据层级浅,针对主题只抽象出一个层级,保证底层数据可复用即可。其中数据源,出现了日志进入到hive的步骤是因为:
随着业务的发展,数据量的增多,业务形态越发复杂。基于 TIDB 构建的数仓已经无法满足要求,主要体现在:
针对上述问题,从以下几个方面进行了调整:
目前伴鱼数仓团队,承接公司全部业务线的数仓建设工作,对接公司内部各个业务线,每条业务线的形态不同,数据的使用方式也不同。
基于当前能力该如何解决上述问题?调研后发现大体有如下几种方式:
方式一(分总形式):
业务线或部门自建数仓,各个业务线分别建设自己的数仓,数仓与数仓之间无直接关系,使用其他业务线数据,通过权限申请拉取使用,或通过FTP文件的形式同步数据。例如运营商各个省份的数仓是独自建设的,可能由不同的厂商承接建设,在建设后以统一的格式推送至总部,再在总部进行进一步的数据清洗。
方式二(分层形式):
划分基础数仓与应用数仓,基础数仓通过自下而上,面向于主题的方式进行设计,更加专注的做好底层建设。应用数仓通过自上而下,面向于应用的进行开发,更好的支持业务需求。很多大厂当前都是以这样的方式设计,集团总部负责总部的开发与设计,业务线使用总部加工的数据宽表或事实表进行业务开发,如果遇到新的数据表。需给基础数仓提需求,由基础数仓排期开发。
方式三(总分形式):
业务线内垂直建设,横向设计,纵向开发,统一设计并制定数仓整体规范,各个业务线按照统一的规范进行各自业务线的开发。跨业务线使用数据需要申请相应的数据权限,了解其表结构与口径,直接使用其他业务线数据。在中小型企业中,业务线杂而多,但是业务线内部也没有数据开发人员,使用这种方式成本较低,并且可以快速响应业务需求。
伴鱼内部也针以上的部分方式进行思考与尝试:
方式一,自建数仓,这样会带来一些问题:
基于以上问题,数仓是由数据中台统一建设。未对此方式进行尝试。
方式二,分层建设,遇到的问题:
方式二最主要的问题是,业务反馈数仓团队效率变低,无法快速响应需求。
方式三,横向设计,纵向开发,遇到的问题:
方式三最主要的问题是,规范的统一,烟囱式的开发问题。
综上,伴鱼内部确定了当前业务场景下较为合理的指责划分方式,以方式三为主,并进行了部分优化:
ODS:贴源层,离线或准实时接入的数据,接入多种数据源。
DWD:明细数据层,整合原始数据,有两部分操作,1)对 ODS 层的数据做一定的清洗和加工,规范化,2)进行维度建模,对数据表进行单个业务过程的宽表化,冗余维度。
DWS:轻度汇总层,对单个主题的多行为进行宽表化处理(不跨主题)。
DM:数据集市层,对多个主题,跨主题,跨业务线的整合型数据表,面向挖掘,数据分析等。
ADS:应用层,高度汇总数据,面向业务的结果数据。
其中ODS层数据源由平台提供数据抽取能力,保证数据的同步,DW、DM、ADS 层统一由数据仓库团队负责。
将各种源的数据接入到HIVE中,保留原始数据结构信息。主要数据来源:数据库数据、日志数据、外部数据。
数据库数据:主要两种数据源,1)MONGODB,2)TIDB,分别通过 oplog 和 binlog 进行同步,可选择以增量或全量的方式进行。
日志数据:通过 Flink 消费 Kafka 中的数据,存储到HDFS中。使用较多的是埋点数据,中台统一了 Web 、安卓、Ios 三端的 SDK,保证不同端使用相同的上报形式,并可进行测试,监控来保证埋点的质量。
外部数据:通过统一的清洗,通过工具进行上传,存入 HIVE 表中。
先规范化数据,再进行维度建模。
对于第一步规范化,很多人认为没有必要,直接划分业务流程,做维度建模就可以完成dwd层的建设。思考以下几点:
这些都是数据常见的操作,如果将这些动作与维度建模和合并成一个步骤,建模的物理模型将是混乱的,在伴鱼内部,将此步骤单独构建,产生标准化的表,方便下一步维度建模使用。如:用户级别变化表 ODS 层为增量拉取,DWD 层标准化:增量表 merge ,字段、类型标准化,兼容算法定级,模型定级数据表。保证用户级别变动可从一张表产出。
第二步维度建模,构建思路:
融合多业务过程,形成对应主题的轻度汇总宽表。构建思路:
注意:DWS 表虽然跨业务过程构建,但是不跨主题,保证每个主题下数据的完整性和准确性。
如:交易主题,仅包含与交易有关的业务过程,包括支付、退费等。
面向于业务线、跨主题,构建思路:
如:用户行为数据,业务线内从用户注册到用户使用的行为数据汇总,到在其他 app 内的下单,支付等行为数据的冗余。该层面向于对应业务线分析挖掘等,更加方便使用。
数据应用,按照应用场景进行开发,构建思路:
下图是某业务线在此规范下的整体设计:
未来,期望可以真正做到,通过数据赋能业务,驱动业务,更好的体现数据价值,主要体现在以下几方面: