从美团外卖的数据仓库建设中,我学到了什么?

楼主
讨论所有与SQL有关的内容

前两天,转载了美团外卖的两篇数据仓库文章。第一篇讲他们的实时数据仓库建设,第二篇讲离线数据仓库。两篇文章都发人深思。于是,我花了点时间,拆解了各自的项目实现。

 

这是第二篇拆解,针对离线数据仓库,美团外卖讲述了他们的玩法。这篇感觉更接地气,和传统数据仓库项目,贴合得更紧。换句话说,这次的离线仓库,不仅对互联网行业具有借鉴意义,对非互联网行业,同样也具有参考价值。

 

传统数据仓库,数据基建包括了 ETL, 建模和可视化。从数仓范畴的概念上入手,美团外卖的离线数仓,也同样是这些。但形式、落地与逻辑,稍有些扩展。

 

比如,做传统行业的数仓工程师,都知道数据的组织与存储,以关系型结构化数据为基准,以维度模型为扩展。强烈的二维属性已经刻在我们脑子里。即使在二维中硬生生增加多维的扩展模型,本质上还是二维存储。

 

但在互联网业务中,比如美团外卖。很多业务数据开始有了离散的结构。就好比日志。一个用户的订单,来来回回有多种增删菜品的组合。这样的行为数据,需要入库,对于关系型数据库,极为不便处理。

 

再举一个例子,用户与商家,用户与用户之间的评论,又是离散的。这样一个主题帖,就像一棵树结构,最好的办法就是将整棵树都存起来。

 

综合美团外卖的业务,可以将数据分为两部分,一部分是事务性关系型业务数据;另一部分是离散结构,半结构化的业务数据,比如评论,用户行为日志等。

 

架构

 

与上篇实时数仓一样,这次的离线数仓,也是先从业务架构入手分析。

 

 

美团的业务图,做得十分清爽。每个业务链路,规划的都很明晰,一目了然。从用户下单,商户上单,骑手接单配送,销售运营,方方面面都考虑在了数据这条生态链上。

 

业务架构清晰了,数据架构自然也就跟上来了。

 

 

在四个数据层,层与层之间的数据交互,都有不同的工具实现。正因工具多变,监控这些工具的数据流是否正常,也是大事。所以,数据流及其流监控手段,还需要加在这幅全景图中。比如 Sqoop, Flume, 以及传统的 ETL 工具。

 

这里值得关注的是,美团将大量的 Hive ETL 工作都转移到了 Spark 上面。由此可见,将来的趋势,必将给与 Spark 更多机会。那么 Spark 与 Hive 相比,会有哪些明显的优势呢?文中指出,至少有 3 个:

 

算子丰富,如果是用 Spark 计算库来说,那是真的丰富。比如机器学习算法,HQL 毫无优势。

 

缓存中间集,不用像 Hive一样,每次都利用硬盘来缓存,是 Spark 最大的优势。

 

资源复用,申请的计算资源可以重复利用。这先按下不表,因为我也没理解,这优势的本质,在哪里。

 

 

转型

 

美团从传统的数据仓库过度到现代互联网主流数据仓库设计,经历了很长的路程。那么在这些历程中,哪些是关键点,为什么会做出如此的技术选型?看看美团怎么说。

 

刚开始,2016年以前,美团业务量不大,但竞争激烈。为了配合业务,堆人完成开发。造成的局面一度尴尬:整体开发效率低;统计口径不一;垂直切分技术资源,造成人力浪费。

 

来看下当时的美团技术架构:

 

 

分层也很明晰:ODS\明细\聚合\主题\应用。 

 

ODS层, 这里特别说明下。从各个数据源汇总过来的数据,都会先落在ODS层,有一定的清洗,意味着数据有筛选,更干净,更符合标准格式。

 

可以看到美团数仓1.0的分层,是以总部+城市来展开的。这种分层,造成的重复计算是毋庸置疑的。很多计算指标都是重合的,总部和城市本身就是地区维度的上下层级关系,完全没必要分开。所以这种分层必须按照业务重新划分。

 

于是美团 2.0 时代就改变了:

 

 

这回,就彻底把分层做足了。按照应用来划分层次,并且在每个层次上又再分层。

 

其实这里有个很重要的转型时间点。并不是一上来就要精细化开发,把每个主题都安排的妥妥当当。还要看业务发展的势态。

 

业务早期,稳定性和持久性,还没有突破,过早进入精细化数仓建设,是不合理的。此时要做的事情,完全是辅助业务的开展,在没有准确供给业务所需数据时,就要上一些高大上的数仓指标体系建设,那是浪费资源。

 

所以,数仓的建设还要围绕着业务去开展,强烈关注业务的开展状态。

 

一旦业务稳定,势态良好,那么应用就会越来越多,这个时候开展数仓的分层设计,就会顺理成章。

 

 

分层

 

一切围绕业务应用而生,而业务应用,也再一次的分层:业务引导(数据挖掘,推荐)主题;分析(运营分析,财务分析)主题;业务主题(以事实业务过程为基础的分析)。

 

总的来说,这一层指导和铺垫了底层数据的分层建设,该层也叫主题标准。

 

这些主题标准切分开来了,但实现这些主题切分的人,还没有定义出来。到底是业务架构,还是技术架构兼任?

 

不管是谁来做,这样的融合必定是不可少的。懂技术的,并不一定懂业务,懂业务的,不一定懂技术。所以必须有人来双向融合。这大概就是架构师要做的事情。

 

主题区分开来了,技术的定型也就确定了。以前大家都是拿一块业务,还有可能是同一块业务,垂直的在各自造烟囱。看上去大家都是全栈,实则浪费资源。

 

此时,将人力资源分层,做建模,做数据应用,团队的资源就不会浪费在同一块地方。比如之前,数据组的每个人都在做商家统计,不同的是一组在处理总部来的需求,二组则在处理每个城市来的需求。其实有些共性的部分,大家可以放在一个模块来完成,不必各自为政。之前的这种团队划分,称之为垂直划分。

 

而美团数仓2.0,则更多横向划分。从建模到应用,每个段切分,专人专做整个链路的某一段。

 

从主题到最终的物理层实现,需要两组人马不停的融合。一组人负责不停的处理业务需求建模,另一组人负责物理数据的建模。这两组人一定需要在某个点上达成一致。所以分工标准就出来了,数据应用组和数据建模组。

 

 

 

刚才美团数仓1.0,数据分成了四层:ODS/明细/聚合/应用。现在需要将数据分得更细,做更多的解耦。

 

其实也可以用接单的stage1,stage2,stage3来划分。但每一层做些什么,当然还是要了然于胸。

 

比如stage1,整合多数据源的一致性建模,完成数据维度,事实组合。stage2,用来完成聚合汇总,进一步按照粒度划分,完成年月日级的聚合。至此,一个中央数据仓库就完成了。stage3,按照业务单元,做数据集市。比如营运,销售。这样提供给数据应用层,就有了完整的数据源。

 

在数据整合层,要注重排查的两个概念,一是宽表,二是聚合表。宽表与 kimball 的 fact table 不一样,我们通常所说的fact table,实际上仅仅是明细表的统称,而宽表,则是把相关的事实表,都整合到一起,这样的好处,一是加快速度,二是一次查询更加全面。

 

举个例子说明下大宽表的定义:选定实体对象(比如订单),圈定分析对象(比如订单头,明细,状态,订单召回等),构建宽表模型(通过订单id,将这些表关联到一张表)。

 

 

最终的应用层,会简单很多。主要是选型,也就是针对业务数据应用,会选择哪些数据库技术,分析引擎技术,还有报表计算。归纳起来,离不开存储,计算,可视化。

 

 

缺陷

 

美团数据仓库2.0,还是有很多缺点。如下图:

 

在数据集市层,会过度膨胀。因为层与层之间一旦分割,便会有不同的想法。今天她要这个指标,明天他又要那个指标,其实他俩指标都差不太多,但就是要设计两套,最终导致数据集市层膨胀。而数据仓库3.0就是来解决这样的问题。

 

 

说实话,这是我从来没有想到过的一层。使用建模工具替代人工开发。因为这套玩法,我从来没用过啊。这大概就是美团外卖的先进之处。

文章还提到另一个数据仓库方向是数据治理。它分享了三个小点:数据开发流程,数据安全管理,资源优化。这一块也是我的弱项,下回,我就来盘它!

分享扩散:

沙发
发表于 2021-11-9 08:18:01 发布于APP客户端
讲解很详细?
板凳
发表于 2021-11-9 10:19:19
自助查询工具应该很难开发出来把,一般人顶多直接搞个多维度宽表,然后借助fineBI,业务同事自行选择维度,指标
地板
发表于 2021-11-9 11:51:59

分析总结得比较深入,数据仓库还有这么高级的玩法。
3.0的数据仓库优化模式,一般的项目估计都用不上,也就美团这种数据体量、分析规模和海量预算的企业能采用的解决方案。
期待楼主对美团数仓在数据治理方面的分享。
5楼
发表于 2021-11-12 10:45:23
这个着实不错
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部 返回列表