作者:张哲(花名 渝知) 友盟+高级技术专家
友盟+ 简介
友盟+ 以“数据智能,驱动业务增长”为使命,为移动应用开发者和企业提供包括统计分析、性能监测、消息推送、智能认证等一站式解决方案。截止2023年6月,已累计为270万移动应用和980万家网站,提供十余年的专业数据服务。
作为国内最大的移动应用统计服务商,其统计分析产品 U-App & U-Mini & U-Web 为开发者提供基础报表及自定义用户行为分析服务,能够帮助开发者更好地理解用户需求,优化产品功能,提升用户体验,助力业务增长。
为了满足产品、运营等多业务角色对数据不同视角的分析需求,统计分析 U-App 提供了包括用户分析、页面路径、卸载分析在内的多种「开箱即用」的预置报表,集成 SDK 上报数据后即可查看这些指标。除此以外,为了满足个性化的分析诉求,业务也可以自定义报表的计算规则,提供了事件细分、漏斗分析、留存分析等用户行为分析模型,用户可以根据自己的分析需求灵活地选择时间范围、设置事件名称、where筛选和Groupby分组等。
如上所述,U-App 服务了众多应用场景,每天处理接近千亿条日志,需要考虑平衡好数据新鲜度、查询延迟和成本的关系,同时保障系统的稳定性,这对数据架构和技术选型提出了极高的要求。
针对报表类型不同的看数场景和业务需求,我们底层技术架构通过多种产品来支撑。在数据新鲜度方面,分别使用 Flink 和 MaxCompute 提供了T+0 的实时计算 和 T+1的离线批量计算,主要支持预置报表的计算场景,并将计算好的结果导出到类HBase 存储,能够支持高并发的报表查询。在分析时效性方面,使用阿里云的Hologres 实现自定义报表支持秒级的 OLAP分析,当处理的数据周期跨度大时,可能会出超过内存算子处理范围,因此我们转化为离线计算引擎来执行,同时也让交互体验从同步降级为异步。
在本文中,我们会分享友盟U-App 背后的技术实现,以及友盟在行为分析和画像分析场景上的最佳实践。
友盟+技术架构
如下图所示,在大数据领域这是一个比较通用的数据处理 pipeline,贯穿数据的加工&使用过程包括,数据采集&接入、数据清洗&传输、数据建模&存储、数据计算&分析 以及 查询&可视化,其中友盟U-App 数据处理的核心架构是红框部分。
U-App 整体架构如下图所示,从上往下大体可以分为四层:数据服务、数据计算、数据存储以及核心组件:
数据服务:将查询DSL 解析为底层引擎执行的DAG,同时智能采样、查询排队等来尽可能减少系统过载情况,保证查询顺滑
数据计算:根据不同分析场景抽象沉淀了分析模型,包括行为分析和画像分析两大类
数据存储:使用了以 User-Event 为核心的数据模型,提供基于明细数据的行为分析
核心组件:离线批量计算使用MaxCompute,流式计算使用Flink,OLAP计算使用Hologres
在设计系统架构时,支持多引擎是优先要考虑的,主要有以下原因:
鉴于成本、稳定性、高可用以及容错性考虑,引擎需要根据查询场景分级路由,将查询性能好的OLAP计算与健壮可靠但延迟较大的离线计算相结合。用户可以使用 OLAP 分析进行灵活的数据探查,当数据量超过一定阈值时自动转为离线计算。另外,对于添加到看板需要例行查看的报表也会通过离线的方式批量计算。
鉴于存储成本考虑,将数据进行冷热分离,实时数仓只储最近1个月热数据,超过查询范围的Query会自动路由到离线计算。
从系统的可扩展性考虑,OLAP领域发展很快,众多引擎百花齐放,需要为之后对接其它引擎预留出灵活的升级空间。
同时,我们也设计了一套通用的计算规则来支持多引擎架构,屏蔽底层细节。借鉴了Presto系统设计,选择Antlr来定义通用的查询规则,查询DSL使用JSON来描述。Task Builder 在生成任务DAG时,遍历AST抽样语法树,并结合物理表存储等元数据信息,生成指定引擎可执行的语句。
通过自定义描述语言,上层业务只需要对接DSL不用关注底层细节,既降低了业务对接成本,也增强了平台扩展性。
基于这套技术架构,我们服务了友盟+U-App 产品中的众多应用场景。其中,基于明细数据的用户行为分析和基于全域标签的画像分析是非常重要的两个功能,其实现主要使用了阿里云Hologres,下面我们会详细介绍这两个场景上的最佳实践。
Hologres多维分析使用实践
在多维分析场景,尤其是用户行为分析和画像分析场景上,市面上可选择的OLAP产品还是较多的。我们对集团多个引擎进行深入调研和测试后,最终选择了阿里云计算平台的Hologres,主要基于以下考虑:
存算分离架构:计算资源弹性伸缩,满足灵活扩展性的同时又兼顾了成本。
生态丰富:语法与PostgreSQL函数兼容,我们使用起来的时候比较方便。同时我们也与Hologres团队共建,支持了一些UDF函数,方便我们业务深度开展。
与MaxCompute深度集成:可以和MC互相直读,加速查询,实现实时离线联邦查询。同时也支持冷热数据混合查询,有利于成本性能平衡。
性能强悍:引擎C/C++编写,支持量化全异步执行,PB级数据查询秒级响应且支持数据实时写入。
用户行为分析实践
U-App行为洞察提供了事件、漏斗、留存 、行为路径等模型,可以帮助业务从多视角洞察用户细粒度的使用行为,从而进一步辅助业务精细化运营。
U-App 行为洞察提供的是普惠的交互式分析服务,这对技术的挑战主要包括以下几个方面:
数据量大,每天新增日志条数接近千亿级别(注:为了保证查询灵活性,分析使用的是没有信息损失的事件原始数据,即没有使用中间聚合表)
应用众多,不同应用数据量差距较大
自定义埋点数据 schema-free ,不同应用埋点属性差异巨大
计算分析速度要快并发要高
为了应对以上诸多挑战,我们从存储层、引擎执行层以及查询层制定了系统性化的解决方案,下面依次进行介绍。
数据存储层设置合理的索引
根据业务查询特点,在Hologres中合理的建立索引,尽可能减少Scan的数据量:
根据查询特点(每个查询只涉及一个应用的有限几个事件),按照appkey,event_name建立聚簇索引(Clustering Key)
根据用户行为分析的特点,按设备id分片(Distribution Key),数据在woker节点正交分布,减少跨节点数据 shuffle
设置合理shard数量,平衡数据写入和查询性能
对常用筛选列建立Bitmap索引,提升数据过滤效率
在埋点场景上,开发者可设置自定义事件和属性,自定