导读 本文将分享蚂蚁集团近两三年在实时数仓领域的探索和实践。
本次分享将围绕以下四个方面展开:1. 蚂蚁实时数仓架构
2. 实时数据质量保障
3. 流批一体应用
4. 数据湖落地展望
分享嘉宾|马年圣 蚂蚁集团 实时数仓架构师,数据技术专家
编辑整理|梁维
内容校对|李瑶
出品社区|DataFun
01
蚂蚁实时数仓架构1. 实时数仓架构设计 蚂蚁实时数仓的架构主要包括计算引擎、研发平台、计算资源、实时资产、研发工具和数据质量六大模块,这六个模块覆盖了实时数据研发的全流程,但也面临着许多问题,包括如何管理实时数据资产和口径、如何管控实时资源、平台能力是否健全等。在实时数据的应用场景中,数据的准确性和稳定性尤为重要。因此,如何持续监控和发现数据质量问题是实时数据研发过程中面临的一大挑战。同时,随着实时数据应用场景的增加和需求吞吐量的上升,还需关注实时研发流程效率如何提升和计算能力如何建设的问题,这就需要我们深入到实时研发链路中分别攻克相应的痛点。 相较于离线完善的实时计算引擎和生态,实时数据研发生态和资产相较而言还有较大的提升空间。和业界开源使用的 Hive/Spark 离线计算生态类似,阿里的 ODPS 也有一套完善的计算体系,从上到下包括客户端模块、接入层、逻辑层和存储计算层,同时还有相对应的账号和元信息服务。如果只是离线数据计算和分析的话,当数据入仓后即可在此生态内一站式地进行研发和运维。实时计算对用户而言复杂很多,其中最突出的是实时数据资产以及对应的存储。根据计算特性和方案的不同,实时计算可以对接相当多的存储引擎,每个引擎又都有相对应的计算和存储特点,如何管理好这些连接信息和其底层对应的数据语义,是实时资产模块需要建设的能力。和离线计算类似,实时资产也应该具备数据内容定义(对标 ODPS 表 Schema 定义)、生产体系(对标 ODPS 计算能力)、消费体系(应用数据的对外使用)和资产管理(实时数据的管理)等能力。综合以上的考虑,蚂蚁通过实时元表来进行实时资产的定义和管理。实时元表之上建设了元表定义、元表消费、元表管理和元表质量四块的能力,让用户基于元表便能进行实时数据的研发和运维操作。 蚂蚁实时数仓架构主要包括数据源接入、实时数据存储、实时计算引擎、实时数据研发能力、实时数据服务和实时数据质量几大模块,细节如下:(1)蚂蚁的实时计算数据源主要来源于线上日志、数据库日志和实时消息,计算引擎选用 Flink 和 ODPS(主要用于维表加工),存储引擎和业界对齐,包括消息中间层 Sls、OLAP 引擎 Explorer、OLTP 存储引擎 Hbase。(2)相较于离线计算中的统一物理文件和 Meta 信息,实时计算的存储选型是多样的,不同的实时存储引擎都有自己的文件存储模式和底层信息格式,这里使用元表维护不同的数据源、物理表、字段的定义,并做到定义可复用的能力。(3)在计算研发平台中,除了基础的实时计算能力以外,我们着重构建了低代码研发和流批一体的能力,其中低代码研发是希望用户直接进行配置即可完成实时任务的研发和上线。而流批一体主要解决实时离线数据口径、消费链路不统一的问题,期望通过一套代码和一套引擎来提升研发和运维的效率。(4)对于实时数据的消费模块,主要分为实时数据分析和实时数据服务两大场景,其中 OLAP 场景主要解决实时数据多维分析的问题,而 OLTP 场景则会和工程算法层进行联通,提供在线的实时数据服务。(5)对于实时数据质量模块,基于实时元表构建了较多的事实数据保障能力,如 DQC 监控、主备对比、异源核对等。2. 实时数据解决方案
流量场景中转化归因是流量效能的一大重点,离线中通过流量日志和转化日志关联,并使用自定义排序算法,剔除返回的路径,最后生成用户转化的路径图。在实时计算中,双流 join 可解决此类问题,但流量过大会导致 Flink 后端状态过大,且如果多个转化事件接入后,计算成本成倍增长。亦或者将流量数据写入到诸如 Hbase 的维表中,转化事件到来时进行维表关联,但此方案需要严格的流量在前、转化在后的上报逻辑,如果流量日志延迟上报,转化数据就会失真。最终我们使用实时流图来解决此类问题:(1)首先在图数据库中,构建用户和流量日志、转化事件的关联关系,当一个转化事件触发后,会筛选用户完成转化事件之前的流量路径。(2)根据流量日志的时间生成路径的拓扑,剔除掉链路中的环,最后生成用户的访问路径图。(3)将以上生成的拓扑图打平拆成多条记录,形成实时转化归因表,进行实时分析和二次消费。当前方案主要依赖图进行归因的计算,Flink 只是做了数据入图和消费图中结果数据的工作。除此之外,还有一些后续会实践的解决方案:一是端上流量日志串联,通过在端上定义重要转化事件,实现边缘计算效果;二是数据湖准实时构建,以解决状态问题。 去重类指标主要应用于两个场景:一是绘制天级按分钟累计的趋势图;二是在活动期间,查看整个活动期间的用户。实时计算在活动期间可能面临状态较大的问题,一旦发生问题,回补计算将变得困难。针对这些场景,我们有以下几种解决方案:(1)对于天级按分钟累计,对用户进行去重,将去重后的分钟级新增数据分发并聚合,从而得到累计数据。但这种方法存在数据量大、难以回补的问题。(2)可以使用 Flink Cumulate Window 来计算累计 UV,这是一种渐进式窗口,能够直接计算累计数据。(3)维表 Join 也是一种常用方法,通过将用户明细流写入维表并关联,可以判断用户是否之前来过,从而计算新增数据。(4)还可以使用估算能力,如 Hyperloglog 或 Thetasketch,生成 UDF 进行聚合,得到最细粒度的累积数据,在下游使用 merge 能力达到高精度的累积 UV。如果希望得到准确的累计 UV 的实时数据,并且也希望保证查询端具有一定的灵活性,可以使用 BitMap 来实现,如计算每小时的 Bitmap Bytes,在查询时进行Merge Agg,但对于活动期较少的场景,分小时的 Bitmap 数据会有较多的小文件,影响查询的性能,是否可以将累计的 Bitmap 进行合并,这样就能保证查询是 Bitmap 文件在较小的数据量,具体细节在后续流批应用场景介绍。02实时数据质量保障
蚂蚁的实时数据质量在事前和事中两个阶段进行针对性保障,其中:流批一体应用
在构建流批能力之前,先来看下当前实时数仓中的数据链路情况。在 Lambda 架构中,三个消费场景的实时离线数据融合方案还不统一,从数据侧到应用侧都有触发流批数据融合的逻辑,但本质上还是流批模型字段对齐的语义表达,下游便可实现字段对齐逻辑。其次在实时数仓中,大部分都是 ODS/DWD 层直接计算累计结果,而离线数仓中,应用层数据大部分都是从轻度汇总层计算得到。因此在构建流批数据时需要考虑这样的差异,可能流和批表的对齐方式就是明细和汇总。 流引擎和批引擎在落地的过程中有很多的工作量,这里主要介绍 Flink 批计算引擎的架构:数据湖落地展望
以上的流批一体方案还只是计算层的流批,在代码中需要明确区分流任务和批任务的处理方式。流数据一般存储在消息中间件中,而批数据则存储在 ODPS 中。研发时需要感知流和批任务的不同特性,并进行针对性的处理。在计算流批之上可以通过存储的流批一体,通过将实时数据和离线历史数据回流到数据湖中,来实现最终的流批一体计算存储方案。蚂蚁当前选用的是 Paimon 作为数据湖组件,基于 Paimon 可以实现从 ODS 到 ADM 层进行数据准实时的计算和消费。蚂蚁当前主要有三条不同时效性的调度任务,分别是:天级调度、小时级调度和实时任务,综合三者的数据基本可完成所有的数据需求研发,但在开发过程中需要进行数据的来回同步,计算链路相当复杂。在引用 Paimon 作为进行实时数据湖研发之后,可在 Paimon 这一组件中完成全链路的准实时数据研发,大大简化了实时研发的链路和复杂度,并可实现一套计算引擎、一份存储、一份资产。 以上就是本次分享的内容,谢谢大家。分享嘉宾
INTRODUCTION
马年圣
蚂蚁集团
实时数仓架构师,数据技术专家
马年圣,毕业于河海大学,先后就职于网易、阿里、蚂蚁等互联网公司,当前工作重心在实时数据研发和架构,负责蚂蚁集团广告、决策等领域实时数据。
活动推荐
往期推荐
分布式 Data Warebase - 让数据涌现智能
火山引擎基于 DataLeap 的电商指标管理实践
聚焦电商场景,详解抖音集团埋点及归因分析方案
金融场景中的指标体系建设与应用
指标归因在互联网平台的应用
弱监督建模技术在蚂蚁风控场景中的探索与应用
京东RaftKeeper2.1发布,让CK告别ZooKeeper!
Apache SeaTunnel——OLAP 引擎的数据动脉
DataFunCon北京站精彩回顾|附PPT 下载方式
数据在零售供应链领域的应用
点个在看你最好看
SPRING HAS ARRIVED