admin管理员组

文章数量:1530353

1、背景

随着小米互联网业务的发展,各个产品线利用用户行为数据对业务进行增长分析的需求越来越迫切。显然,让每个业务产品线都自己搭建一套增长分析系统,不仅成本高昂,也会导致效率低下。我们希望能有一款产品能够帮助他们屏蔽底层复杂的技术细节,让相关业务人员能够专注于自己的技术领域,从而提高工作效率。通过分析调查发现,小米已有的统计平台无法支持灵活的维度交叉查询,数据查询分析效率较低,复杂查询需要依赖于研发人员,同时缺乏根据用户行为高效的分群工具,对于用户的运营策略囿于设施薄弱而较为粗放,运营效率较低和效果不佳。

基于上述需求和痛点,小米大数据和云平台联合开发了增长分析系统(Growing Analytics, 下面简称GA),旨在提供一个灵活的多维实时查询和分析平台,统一数据接入和查询方案,帮助业务线做精细化运营。

2、增长分析场景介绍

如上图所示,分析、决策、执行是一个循环迭代的过程,因此,增长分析查询非常灵活,涉及分析的维度有几十上百个,我们无法预先定义好所有要计算的结果,代价太高,所以这也就要求了所有的数据需要即时计算和分析。同时,决策具有时效性,因此数据从摄入到可以查询的时延不能太高。另外,业务发展迅速,需要增加新的分析维度,所以我们需要能够支持schema的变更(主要是在线增加字段)。

在我们的业务中,增长分析最常用的三个功能是事件分析(占绝大多数)、留存分析和漏斗分析;这三个功能业务都要求针对实时入库(只有append)的明细数据,能够即席选择维度和条件(通常还要join业务画像表或者圈选的人群包),然后在秒级返回结果(业界相关的产品如神策、GrowingIO等都能达到这个性能)。一些只支持提前聚合的预计算引擎(如Kylin),虽然查询性能优秀,但难以支持schema随时变更,众多的维度也会造成Cube存储占用失控,而Hive能够在功能上满足要求,但是性能上较差。

综上,我们需要存储和计算明细数据,需要一套支持近实时数据摄取,可灵活修改schema和即席查询的数据分析系统解决方案。

3、技术架构演进

3.1 初始架构

GA立项于2018年年中,当时基于开发时间和成本,技术栈等因素的考虑,我们复用了现有各种大数据基础组件(HDFS, Kudu, SparkSQL等),搭建了一套基于Lamda架构的增长分析查询系统。GA系统初代版本的架构如下图所示:

GA系统涵盖了数据采集、数据清洗、数据查询和BI报表展示等一整套流程。首先,我们将从数据源收集到的数据进行统一的清洗,以统一的json格式写入到Talos(注:小米自研的消息队列)中。接着我们使用Spark Streaming将数据转储到Kudu中。Kudu作为一款优秀的OLAP存储引擎,具有支持实时摄取数据和快速查询的能力,所以这里将Kudu作为热数据的存储,HDFS作为冷数据的存储。为了不让用户感知到冷热数据的实际存在,我们使用了动态分区管理服务来管理表分区数据的迁移,定期将过期的热数据转化为冷数据存储到HDFS上,并且更新Kudu表和HDFS表的联合视图,当用户使用SparkSQL服务查询视图时,计算引擎会根据查询SQL自动路由,对Kudu表的数据和HDFS表的数据进行处理。

在当时的历史背景下,初代版本的GA帮助我们用户解决了运营策略较为粗放、运营效率较低的痛点,但同时也暴露了一些问题。首先是运维成本的问题,原本的设计是各个组件都使用公共集群的资源,但是实践过程中发现执行查询作业的过程中,查询性能容易受到公共集群其他作业的影响,容易抖动,尤其在读取HDFS公共集群的数据时,有时较为缓慢,因此GA集群的存储层和计算层的组件都是单独搭建的。另一个是性能的问题,SparkSQL是基于批处理系统设计的查询引擎,在每个Stage之间交换数据shuf

本文标签: 小米平台ApacheDoris