提效10倍:基于Paimon+Dolphin湖仓一体新架构在阿里妈妈品牌业务探索实践

news/2025/2/23 17:46:21

1. 业务背景

阿里妈妈品牌广告数据包括投放引擎、下发、曝光、点击等日志,面向运筹调控、算法特征、分析报表、诊断监控等应用场景,进行了品牌数仓能力建设。随着业务发展,基于Lambda架构的数仓开发模式,缺陷日益突出:

  1. 数据开发效率低,面向一些业务场景,需要同时开发离线和实时两套任务,开发和运维成本增加。

  2. 存储成本增加,需要维护离线和实时两份存储,存储代价大。即使实时数仓开发,也需要将存储在TT的各层数据回流ODPS,用作数据备份和case排查,增加了额外存储开销。

  3. 计算资源消耗大,离线和实时任务需要消耗ODPS和Flink计算资源。

通过数据湖+OLAP湖仓一体架构,对传统数据链路进行升级。流批一体的开发模式,不仅节省了人力开发运维成本,降低计算存储资源消耗,许多业务场景下数据时效性和查询效率显著提高。

2. Paimon湖存储

Apache Paimon从Apache Flink社区内部孵化出来,是新一代的湖格式,创新性地使用LSM结构,将实时更新引入Lakehouse架构中。

2.1 相关概念

🏷 Schema

Paimon表元数据,包含表字段定义和配置参数等。

🏷 Snapshot

数据快照,捕获表在某个时间点的状态。用户可以通过最新的快照来访问表的最新数据。

🏷 Manifest

存储Snapshot的文件增删记录信息。

🏷 Partition

Paimon采用与ODPS相同的分区概念来分离数据。

🏷 Bucket

分区表或非分区表数据组织细分为存储桶,可以有效读写数据。

🏷 Data Files

数据文件按分区和存储桶分组,每个存储桶目录包含变更日志文件。Paimon支持使用 orc、parquet、avro作为数据文件格式。

2.2 为何选择Paimon?

Paimon依托Flink社区,生态更加开放,向下支持盘古、OSS等存储,向上支持Flink、Spark等计算引擎,以及各类OLAP引擎。Paimon功能很完善,支持流读流写和批读批写,支持主键表更新,聚合表和部分更新表等能力,是一种读写性能好、存储成本低的湖存储格式。

3. Dolphin相关能力

Dolphin作为OLAP查询引擎,在Paimon湖存储之上沉淀了许多能力,包括产品化和性能优化等技术能力。

3.1 产品化能力

🏷 极光

极光是基于Dataworks插件化框架打造,面向广告领域的一站式研发平台,可通过极光界面创建、写入、查询Paimon表。用户不用关心表的具体参数配置,如有特殊需求,也可以自定义配置。通过极光面向用户透出Paimon+Dolphin的整体能力。

🏷 FBI报表

FBI是用于数据分析和可视化展示的通用工具,可以帮助用户快速搭建各类报表进行数据分析。

通过定义Dolphin作为数据源,用户自己写好业务SQL,可以在FBI报表查询Paimon数据,使用上非常简单。

🏷 黄金眼监控

黄金眼是一个智能化监控系统,包括数据可视化、智能监控告警等功能。黄金眼支持用户使用Paimon作为数据源,通过调用Dolphin提供查询服务。用户按照黄金眼数据接入规范写入Paimon表,在黄金眼界面选择查询条件并展示结果信息。

3.2 技术能力建设

3.2.1 非精确UV计算

PV/UV是常用的数据分析指标,精确UV往往会消耗大量的计算资源,近似UV能满足多数业务场景需要。

Paimon通过定义theta_sketch聚合函数,可以实现非精确UV计算,用作基于Flink任务的数据生产消费场景。

Dolphin扩充了Paimon的非精确UV计算能力,定义了一种新的聚合函数hll_sketch,将UV的近似结果结合OLAP分析场景使用。使用步骤如下。

定义paimon表

写入paimon表参数定义包括merge-engine和fields.xxx.aggregate-function,将后者定义为hll_sketch。

CREATE TABLE IF NOT EXISTS `brand_lakehouse`.`brand`.`uv_table`
(
  `order_id` STRING NOT NULL,
  `uv` BYTES,
  PRIMARY KEY (order_id) NOT ENFORCED
) 
WITH (
  'fields.uv.aggregate-function' = 'hll_sketch',
  'merge-engine' = 'aggregation'
)
;
flink写入paimon表
insert into `brand_lakehouse`.`brand`.`uv_table`
select
    t.pid as pid
    ,HllSketchFunction(CAST(t.aid as BIGINT)) as uv
from brand_ob_midlog
    ,LATERAL table (BrandOBMidLogCommonParser(content)) as t
;
Dolphin查询
select hll_sketch_get_estimate(hll_sketch_in(cast(encode(uv,'base64')as cstring)))
from uv_table 
where pid = 'xxx';
3.2.2 支持SST格式扩展

Paimon支持orc、parquet、avro等列存和行存格式,适用于各类分析场景。虽然Paimon可以定义主键表,但对于QPS稍高(1000以上)的点查场景,查询性能不高。Dolphin支持创建和写入sst格式的Paimon表,以适配对QPS要求更高的业务场景。

使用上仅需要定义文件格式file.format=sst,并结合PRIMARY KEY字段定义。

CREATE TABLE `brand_lakehouse`.`brand`.`brand_aid_behavior_table`
(
    aid       STRING
    ,behavior STRING
    ,dt       STRING
    ,PRIMARY KEY (aid, dt) NOT ENFORCED
) 
WITH (
    'maxcompute.life-cycle' = '3'
    ,'bucket' = '100'
    ,'bucket-key' = 'aid'
    ,'consumer.expiration-time' = '24h'
    ,'merge-engine' = 'deduplicate'
    ,'changelog-producer' = 'lookup'
    ,'write-mode' = 'change-log'
    ,'snapshot.time-retained' = '8h'
    ,'file.format' = 'sst'
)
;

INSERT into `brand_lakehouse`.`brand`.`brand_aid_behavior_table`
SELECT
    aid
    ,behavior
    ,DATE_FORMAT(now(), 'yyyyMMdd') as dt
from brand_midlog
;
3.2.3 查询性能优化

Dolphin可以通过hsf接口查询Paimon表,对外提供高性能查询能力。

查询性能相比Flink、Odps等计算引擎,查询rt更低;相比Holo、StarRocks等OLAP引擎,优势明显。

高QPS低RT性能

分布式多节点(以100个节点16 core64G内存存储pangu hdd为基准)可承接流量:

4. 品牌数据链路升级

4.1 业务场景

品牌数据面向不同业务场景,对于数据时效性以及业务查询范式有所不同。

4.2 业务改造升级

面向品牌数据的新老任务,我们通过paimon+dolphin湖仓一体架构进行链路升级,主要工作涉及基础数据入湖和业务逻辑实现。对于能直接通过查询明细层Paimon表满足业务的使用场景,直接通过调用Dolphin查询接口或极光将数据透出;对查询性能要求更高或业务表征逻辑较为复杂的使用场景,通过构建物化层或编写复杂业务逻辑写回Paimon表,再对外透出加工后的数据。

4.2.1 数据入湖

品牌数据链路主要包括引擎日志数据、曝光点击等网关数据。

Paimon表的写入模式(write-mode)有change-log和append-only两种。change-log主要用于主键表数据的写入、更新、删除,append-only只支持数据的插入,不支持primary key,类比TT、Kafka的写入模式。

对数据质量要求较高的业务场景,我们使用change-log模式,结合merge-engine设置来实现业务数据去重。对于数据量很大但对质量要求稍低的场景,采用append-only模式。

主键表
CREATE TABLE `alimm-brand-lakehouse`.`brand`.`brand_imp_acc_log`
(
    pkey                       STRING
    ...
    ,dt                        STRING
    ,hh                        STRING
    ,PRIMARY KEY (dt, hh, pkey) NOT ENFORCED
) PARTITIONED BY (`dt`, `hh`)
WITH (
    'bucket' = '100'
    ,'write-mode' = 'change-log'
    ,'merge-engine' = 'first-row'
    ,'maxcompute.life-cycle' = '180'
    ,'bucket-key' = 'pkey'
    ,'changelog-producer' = 'lookup'
    ,'consumer.expiration-time' = '24h'
    ,'snapshot.num-retained.min'='3'
    ,'snapshot.num-retained.max'='5'
)
;

INSERT INTO `alimm-brand-lakehouse`.`brand`.`brand_imp_acc_log`
SELECT
    pkey
    ... 
    ,DATE_FORMAT(now(), 'yyyyMMdd') as dt
    ,DATE_FORMAT(now(), 'HH') AS hh
from brand_imp_acc_log
    ,lateral table(BrandLogParserUDTF(content)) as T(...)
;
Append表
CREATE TABLE IF NOT EXISTS `alimm-brand-lakehouse`.`brand`.`brand_sn_trace_log`
(
    campaign_id         BIGINT
    ...
    ,dt                 STRING
    ,hh                 STRING
) 
PARTITIONED BY (dt, hh)
WITH (
    'maxcompute.life-cycle' = '30'
    ,'bucket' = '1000'
    ,'bucket-key' = 'session_id'
    ,'consumer.expiration-time' = '24h'
    ,'write-mode' = 'append-only'
    ,'snapshot.time-retained' = '24h'
    ,'changelog.time-retained' = '24h'
    ,'partition.expiration-time' = '30d'
    ,'partition.timestamp-formatter' = 'yyyyMMdd'
    ,'partition.timestamp-pattern' = '$dt'
    ,'snapshot.num-retained.min'='3'
    ,'snapshot.num-retained.max'='5'
)
;

INSERT into `alimm-brand-lakehouse`.`brand`.`brand_sn_trace_log`
SELECT
    campaign_id
    ...
    ,DATE_FORMAT(now(), 'yyyyMMdd') as dt
    ,DATE_FORMAT(now(), 'HH') as hh
from brand_sn_ht_trace_log
    ,lateral table(BrandSNParseUDTF(content)) as T(campaign_id, ...)
;
4.2.2 业务升级
场景1 品牌履约实时报表

通过品牌履约报表,查看履约中需要交付的指标完成进度,及时发现有交付风险的订单,并分析大盘整体交付指标完成进度分布。

以前数据链路基于odps表实现,数据时效性为小时级。每年双十一大促期间,需要值班同学在0点放量时盯盘,确保品牌广告正常投放,数据时效性差增大了各方人力成本。通过paimon+dolphin对原有链路进行升级,数据时效性由1小时降低到8分钟,并在第一时间发现投放链路可能存在的问题。

业务查询范式比较复杂,经过Dolphin优化查询性能,性能提升了50%。

注:上图为升级后的数据链路,以前链路未画出,可以理解为各部分数据均为odps表。

场景2 品牌多目标调控

品牌广告多目标调控包含售卖组/投放计划维度,全投放周期/天级/小时级的指标曝光/点击/TA/N+reach的诸多指标。由于涉及整个投放计划周期的指标计算,在数据链路上采用了Lambda架构实现。通过paimon对原数据链路进行升级,从计算和存储上实现流批一体,结合paimon自带聚合和部分更新能力,极大简化了数据开发流程。计算、存储资源以及开发成本均降低了50%以上。由于业务场景对QPS要求较高,经过Dolphin优化,支持QPS从50提高到700,rt从1s降低到100ms,性能提升10倍以上。

场景3 品牌线实时特征生产

品牌数仓基于paimon流式湖仓升级原数据链路,将曝光、点击、触达等日志数据写入paimon。

计算近一天时间窗口内投放计划/创意/广告位/店铺/类目等维度的曝光点击实时特征,并利用paimon表partial update的能力,基于aid粒度join曝光点击实时特征数据,将aid粒度各个维度的完整特征数据提供给业务方。

实时特征数据升级提升了特秀合约广告的算法效果,特秀精排CTR模型在首秀、快秀、购后各资源位ctr均有明显提升(2%以上)。

4.3 业务收益

品牌数据链路通过Paimon+Dolphin湖仓一体升级,整体计算和存储成本降低60%以上,人力成本降低50%,业务数据时效性从小时级降低到分钟级,查询性能从分钟级降低到秒级。不同业务场景具体收益点稍有差别。

5. 总结与展望

Paimon+Dolphin湖仓一体架构对业务进行升级,可以给业务侧带来如下收益:

  • 流批一体数据开发模式,减少开发和运维成本

  • 对于ODPS离线表查询为主的场景,数据时效性从小时级以上降低到分钟级

  • 对于以Lindorm/Holo存储为主的分析类业务场景,在满足查询rt的前提下,能极大降低存储成本,并做到数据复用

后续我们将继续推广Paimon+Dolphin湖仓一体架构,面向更多的广告业务场景,以数据湖+OLAP引擎的新模式对业务数据进行升级,实实在在为业务赋能。

▐ 关于我们

阿里妈妈Dolphin营销引擎,最初定位为解决通用OLAP在人群和场景圈选的计算性能问题,历经多年的技术发展与沉淀,目前已形成覆盖OLAP、AI、Streaming和Batch四大方向的智能超融合引擎,提供针对营销场景投前、投中、投后全链路的商家工具和算法策略迭代。欢迎感兴趣同学加入我们!

afa55f005cbb95b7778dca8654a9a3ea.png

↑近期热招岗位,欢迎扫码了解&投递↑

也许你还想看

AI生成存储基座:自研超大规模向量数据库 Dolphin VectorDB

Dolphin:面向营销场景的超融合多模智能引擎

阿里妈妈Dolphin分布式向量召回技术详解

阿里妈妈Dolphin智能计算引擎基于Flink+Hologres实践

Dolphin Streaming实时计算,助力商家端算法第二增长曲线

面向数智营销的 AI FAAS 解决方案

FAE:阿里妈妈归因分析与用户增长分析引擎

大模型时代的阿里妈妈内容风控基础服务体系建设

开源greenplum向量计算库:https://github.com/AlibabaIncubator/gpdb-faiss-vector

END

图片

关注「阿里妈妈技术」,了解更多~

图片

喜欢要“分享”,好看要“点赞”哦ღ~


http://www.niftyadmin.cn/n/5863633.html

相关文章

Windows 上编译 mebedtls 的鸿蒙库

mebedtls 地址:https://github.com/Mbed-TLS/mbedtls 准备工作: clone mebedtls 仓库到本地(tag: mbedtls-2.26.0)鸿蒙工具链(SDK version: v5.0.5) 编译文件修改: 对 CMakeLists.txt 进行修改,主要是关闭了以下几个选项 ENABLE_P…

Spring Boot Validation 接口校验:从零到掌握

在开发 Web 应用时,数据校验是不可忽视的一部分。无论是注册用户信息、提交表单数据,还是处理业务逻辑,数据的有效性和完整性都需要得到保证。Spring Boot 提供了强大的验证功能,基于 Hibernate Validator 框架,通过注…

11.Docker 之分布式仓库 Harbor

Docker 之分布式仓库 Harbor Docker 之分布式仓库 Harbor1. Harbor 组成2. 安装 Harbor Docker 之分布式仓库 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器,由 VMware 开源,其通过添加一些企业必需的功能特性,例…

Spring Boot 集成 T-io 实现客户端服务器通信

Spring Boot 集成 T-io 实现客户端服务器通信 本文详细介绍如何在 Spring Boot 项目中集成 T-io 框架,实现客户端与服务器之间的通信,并支持组聊、群聊和私聊功能。通过本文,您能够全面了解 T-io core 的使用方法,以及如何正确启…

从零开始学 Rust:基本概念——变量、数据类型、函数、控制流

文章目录 Variables and MutabilityShadowing Data TypesScalar TypesCompound Types FunctionsFunction Parameters CommentsControl FlowRepetition with Loops Variables and Mutability fn main() {let mut x 5;println!("The value of x is: {}", x);x 6;pri…

蓝桥备赛(一)- C++入门(上)

一、工具安装 Dev-C安装:https://www.bilibili.com/video/BV1kC411G7CS 一般比赛会用到Dev-C, 但是Dev-C还是有自身的局限性 , 后续的博客学习中 , 必要的时候 , 会使用VS2022 , 下面是VS2022的安装和使用教程。 VS202…

Go语言中使用viper绑定结构体和yaml文件信息时,标签的使用

在Go中使用Viper将YAML配置绑定到结构体时,主要依赖 mapstructure 标签(而非 json 或 yaml 标签)实现字段名映射。 --- ### 1. **基础绑定方法** 使用 viper.Unmarshal(&config) 或 viper.UnmarshalKey("key", &subConfi…

基于FISCO-BCOS搭建第一个区块链网络

一、前言介绍: 本篇博客以Ubuntu虚拟机为例 本篇博客我会大致介绍“搭建第一个区块链网络”的搭建过程,具体的还是要查看FISCO-BCOS的官方文档。会着重介绍在搭建过程中可能遇到的一些报错,以及解决报错的常用方法。 参考FISCO-BCOS的官方文档…