阿里妈妈 Dolphin 智能计算引擎基于 Flink+Hologres 实践
本文整理至Flink+Hologres实时数仓Workshop北京站,已发表在「阿里灵杰」微信公众号,点击文末“阅读原文”查看视频回放。
阿里妈妈数据引擎团队负责广告营销计算引擎Dophin的开发,目前支撑百万级广告主的营销产品,支持万亿级数据毫秒级交互式人群圈选、洞察分析及百亿级数据秒级广告效果分析,同时支持OLAP、实时、离线及AI超融合计算能力,为商家端产品万相台、直通车、超级推荐和达摩盘等营销产品提供极速的数据探索能力。
阿里妈妈Dolphin智能计算引擎介绍
用户打开淘宝 App 时,后台会有两种类型的请求,第一种类型是满足用户诉求的自然推荐,第二种请求是满足用户和商家综合诉求的广告推荐。例如打开淘宝看到某品牌,是因为该品牌使用阿里妈妈营销产品圈选人群进行广告投放,被圈选的人会看到该广告。
商家端营销产品的主要目标是服务于广告主,帮助广告主进行人群投放,从而提升经营效果。此类营销产品覆盖的场景非常广泛,包括人群圈选、洞察分析、Lookalike、人群推荐等场景。这些场景会有OLAP分析、AI算法和实时特征计算的基础能力需求,基于这样一个数据+算法综合能力需求背景下,阿里妈妈自研了Dolphin计算引擎。
Dolphin引擎是一个分析AI一体化的超融合引擎,拥有 OLAP分析计算、 Streaming 流计算、 Batch 批量计算和AI 算法计算四个领域能力,这些能力基于SQL组件和Index Build 组件构建:
- SQL 组件的主要能力是 SQL转义、路由、负载均衡、联邦查询。
- Index Build 组件主要负责智能索引、多级索引(Bitmap索引、时间序列索引等)、调度控制等。
Dophin引擎提供了自研索引、智能物化、智能索引选择、异构数据源查询和近似计算等几个优势功能。其中:
- 智能物化:智能物化指能够自动将SQL转化为物化视图,无需人工手动操作。使用深度模型对业务历史查询 SQL 进行时序分析,比如哪些广告主在什么时间周期的数据使用频率更高,可以选择将高频的使用数据进行物化,以提高数据查询效率。
- 智能索引:大多数业界的做法是为查询建立全索引,而智能索引要做的事情就是分析 SQL 查询语句,判断条件命中率,从而推荐不同的索引,推荐目标为让索引对数据查询的过滤量最大,同时避免建立无效索引占用。
- 近似计算:根据统计的结果用近似的算法来计算,主要针对大规模数据,计算其近似结果。
目前,Dolphin 引擎支撑的业务规模为 2w+core,每日请求量2亿+,QPS为3000+,支撑百万级广告主、存储了PB级数据,涵盖阿里10+核心BU的核心场景如人群圈选、洞察分析等场景,业务方可以通过Dolphin 引擎就能非常高效且低成本的进行数据探索。
Dolphin引擎主要解决两个问题,一个是超大规模场景下使用通用计算方法存在的性能瓶颈问题;第二个就是降低业务方使用引擎成本,甚至做到对底层引擎无感知。很多通用引擎并不能直接解决业务的性能问题,因此需要对数据做索引以实现查询优化。因此我们在已有的引擎基础上建设了Dolphin引擎。那从Dolphin引擎架构图我们也可以看到,引擎的底层计算存储层主要由Flink+Hologres来实现,这就相当于,广告主每一次在Dolphin引擎上的计算,最终都会被转换成由Flink+Hologres来完成,那么我们为什么选择Flink+Hologres这套架构呢?
为什么选用Flink+Hologres?
选择Flink+Hologres这套架构主要来源于对底层引擎的强需求:
1、高性能
广告场景对延迟有着很敏感的要求,如果底层引擎的性能不足,即使上层应用再做优化,也会导致计算性能大打折扣,从而导致广告投放等不精准。
2、可扩展
底层引擎需要足够的可扩展,这样上层应用才能更加灵活的去承接新的业务、新的场景,应对业务高低峰期等 情况
而Flink 和 Hologres能够满足以上两个业务需求:
- 实时引擎Flink支持低延迟,支持自动调优,且技术稳定成熟。用户在 Dolphin Streaming平台上提交 SQL 时,SQL会被转译为Flink SQL,提交给Flink引擎,这里会利用Flink autoscale自动配置调优功能来自动调整,降低可了用户对 Flink 的学习成本和调优维护成本。
- Dolphin引擎与Hologres更有着更长的合作历史:在2019 年Dolphin引擎与 Hologres共建了 Bitmap 计算能力,实现业界公开信息里最大规模、最高性能、最低使用成本的圈人能力;2020 年共建了千万级人群中心,实现广告人群统一管理;2021 年,Dolphin引擎支撑了算法业务场景,使用 Hologres向量计算能力支撑算法业务,主要支撑推荐算法里粗排召回计算环节;2022年,支持了算法实时特征开发能力,这里就运用到 Hologres实时写入和点查能力,实现了更高效的实时开发。最终,我们将Hologres的所有能力整合在一起,形成了超融合一体化引擎能力。
引擎实现细节1:如何解决超大规模OLAP计算能力
挑战:
Dolphin OLAP 计算的核心在于解决超大规模问题。阿里妈妈广告场景上存放着大量的数据,为了让广告主有更好的用户体验,需要支持更复杂的计算逻辑和更快的计算速度。其中典型的场景有单SQL几十张表Join、单表最高万亿行规模、单表基数最高百万级和万级标签日更新。
解决方案:
例如广告场景上有很常见的数据表:用户基础表(性别年龄)和用户店铺表(用户、店铺类型),当需要查询 20、 30 岁且逛过某品牌的用户数量时,如果数据量很少,通用引擎可以很快得出结果;但如果SQL涉及Join的表有几十张,而且还可能存在万亿级表,此类情况下通用计算引擎无法完成计算。因此,我们基于Hologres共建了一套 Bitmap 计算方案。具体方案流程为:
- 方案查询流程:用户输入逻辑执行 SQL ,Dolphin引擎将用户逻辑执行 SQL 转译为物理执行 SQL ,然后传递给 Hologres执行。
- 方案索引构建流程:MaxCompute 将标签数据进行预处理,然后将它构建为 Bitmap 索引,再写入到 Hologres,即可实现的 Bitmap查询。
通过这样的Bitmap方案,能够让查询拥有更好的性能和更低的存储, 在超大规模OLAP计算场景中,支撑了200+QPS ,平均百毫秒查询性能,以及万亿行数据秒级精确计算,高效支撑用户交互式分析低延迟的用户体验。
引擎实现细节2:如何实现低成本的实时开发能力
广告场景通常都是实时计算,这里我们通过Flink来支持是非常方便的,而我们的面向的用户通常都是不同岗位,比如算法、运营等,假如全部都用Flink去开发任务,那么对于上层应用的同学来说就会额外增加非常多的学习成本和压力,比如既要学会Flink SQL,还要学会Hologres SQL,流程和操作都非常繁琐。为了降低用户的学习成本,提升开发效率,Dolphin使用OpenAPI 做了丰富的实践,开发了一套 Dolphin Streaming实时开发平台,通过Open API 直接以服务接口调用的形式调用 Flink 提交作业、暂停作业、管理作业等。
Dolphin Streaming将 Hologres和 Flink 做了封装,对用户暴露更简单的开发接口Dolphin SQL 。用户在阿里妈妈交互式研发平台上提交 Dolphin SQL,SQL变会自动通过 Dolphin Streaming 进行处理,做 SQL 解析及转译,将 SQL 通过 OpenAPI 发送给 Flink,拉起作业做执行。执行完后,数据会实时写入到 Hologres,然后通过Dolphin SQL将写入 Hologres的特征直接查询出来,无需再考虑存储、配置认证信息、token信息等,只需像使用数据库一样开发实时作业,整个流程非常顺滑简单,大大提高开发效率。
demo1:计算用户最近50条行为序列
用户最近 50 条行为序列是算法序列模型里常用的特征,一般需要开发行为序列特征,如果用Dolphin Streaming 开发,只需简单三步:
- 第一步,定义数据源表。Biztype可直接填写为tt ,tt 是阿里的实时数据源。这里如果要写Flink SQL,则需要登入tt管理平台,查询topic并订阅subID。
- 第二步,定义输出表。Biztype=feature 代表写入到 Hologres,然后填好 PK 参数即可。
- 第三,定义计算逻辑。SQL 执行完之后,数据源源不断地写入,通过 select user_id, product_id from ** where user _id=**即可查询用户特征。
demo2:实时Debug功能。
在实时开发时,经常需要查看上游数据源,以往的方式通常需要定义一个print输出源,然后定义输入源和执行逻辑,将数据写到标准输出,再通过查看日志才能获取到上游数据源。而我们实现了更简单的方式。
通过 create table 形式注册一张表以后,执行 select user_id from某表,结果即直接展示表的明细。
通过Dolphin Streaming,我们可以非常高效的将复杂计算逻辑进行自动封装与转换,用户无需自己写SQL,也不需要去学习多种开发语言,就能非常高效的拿到想要的数据,大大降低了学习成本和使用门槛,同时也节省了开发效率。
3 业务场景实战
场景1:实时营销推荐
实时营销推荐是广告中最常见的场景,在该场景下,最大的痛点在于:广告主在使用营销平台时,常常面对如何推广、通过何种渠道推广等问题。
基于这样的用户诉求,从算法角度为广告主解决该问题:通过广告主点击某些信息、某些广告点位时,判断广告主意向,结合意向和广告主本身商家店铺和商品信息,为其推荐能提升经营效果的商品以及效果更优的投放渠道,从而让广告主的投放体验更好。
基于以上需求,我们开发了一套用于捕获用户实时行为的作业:通过 Flink 计算商家实时行为日志,存储到Hologres,然后在线模型直接读取特征,通过实时特征提升模型的推荐效果。
Dolphin Streaming方案主要使用了 Flink 实时计算、Hologres实时写入以及行表的点查能力,使整体开发效率提升三倍以上,推荐效果更佳。
场景2:向量召回计算
在算法里万物皆可向量表示,尤其是在推荐算法和召回流程中,经常使用向量召回获取 Top K 相似对象,在阿里妈妈向量召回的场景中,我们使用Hologres的向量召回能力,以Lookalike场景为例具体说明:
Lookalike是广告产品的重要能力,核心是基于种子人群特征选择相似人群,常应用在拉新场景。以电商场景为例,其原理可以抽象理解为针对已经在店铺有过行为的用户,分析其特征,寻找与之特征相似的用户,将宝贝推广给此类用户,从而促进店铺新用户增长。基于向量Lookalike算法实现过程如下:
- 第一步,广告主圈种子人群。
- 第二步,基于种子人群计算中心向量,再通过中心向量从整体用户里召回 Top K相似的用户。
传统算法下,Dolphin会使用没有向量召回能力的传统数据库,将数据导入到数据库中。先由Dolphin查询数据库,计算种子人群中心向量,然后通过Faiss将Top K 向量查出。传统方案整体运维和管理成本较高,因此我们对其进行了升级,直接使用 Dolphin 调用 Hologres,因为Hologres能够同时支持数据库功能和Proxima向量功能,简化了计算流程。
基于 Hologres的向量召回能力,我们开发了实时向量召回和批量向量召回能力,用户直接输入 SQL 即可调用底层 Hologres,Dolphin封装了容灾和负载均衡等重要能力,简单地填入参数即可完成批量向量召回的计算。其中
- 实时向量召回:支撑1000+QPS,平均延迟50ms+,支撑了直通车、万向台、达摩盘等多个商家段营销业务场景
- 批量向量召回:目前已对外产品化,提升开发效率3倍+,有效支撑达摩盘、直通车等多个算法业务
4 总结
基于 Flink+ Hologres 的强大能力,我们得以建设更贴近业务领域的超融合一体化Dolphin引擎,主要包括基于 Bitmap 的高性能 OLAP 计算、更简单灵活的实时开发能力以及基于Hologres强大的 AI 向量召回能力。
未来,我们会在智能化、一体化方面继续探索,不断提升用户体验。