作业帮基于 StarRocks 画像系统的设计及优化实践

作者|作业帮大数据团队
策划|刘燕
背景介绍
作业帮为提高孩子学习效率通过搜题、答题、咨询等各种行为数据以及辅导效果等结果数据 , 利用算法、规则等技术手段建立用户画像 , 用于差异化辅导提升学习效率 。 我们根据画像标签特点并结合StarRocks能力建设了一套相对适合全场景的画像圈人系统 。 本文主要介绍此画像服务、标签接入的系统设计及圈人性能优化方式 。
标签特点
作业帮基于 StarRocks 画像系统的设计及优化实践
文章图片
注:符号变量为创建人群时确定 。
方案设计思考
为保证系统支持业务需求灵活可扩展、架构合理、实现后系统稳定且性能满足预期 , 在设计前梳理相关问题及思考 。
如果满足以上全部标签类型 , 常规大宽表、标签bitmap化设计无法满足需求 。 需要将带有修饰词的行为类数据和常规标签做交叉 , 而往往两类数据存储在不同的表或数据结构中 , 同时支持秒级查询利用常规join又无法满足 , 最合理的方式仍然是利用bitmap的交叉能力 , 针对不同规则人群分别形成bitmap , 然后结果交叉 。 而使用bitmap结构就必须将用户唯一标识字符串cuid转化为数值类型guid 。
如何将用户唯一标识转化为数值型全局唯一自增guid , 并且实时和离线标签要采用同一套映射关系 。 离线时效性不够所以必须采用实时方案形成映射关系 , 然后同步到离线hive用于补充离线标签 , 映射必须覆盖实时和离线标签全部用户id 。
标签会越来越多而且每个标签基本都需要经过生产计算、补充guid、数据校验报警、写入存储、原子切换上线等一系列操作 , 同时需要控制新增标签的接入成本和后期维护成本 。 为此需要将标签生产部分和标签接入部分解耦 , 抽象接入流程 , 按照指定规范实施 , 尽可能做到标签配置化接入 , 统一化管理 , 支持长线平台化建设兼容 。 标签生产也可按照业务方向多人并行落地 。
性能方面保障需要利用真实数据做相关测试 , 并保证每个环节设计可按照资源扩展线性提高相关处理能力 。 例如数据入库、圈人查询、实时cuid->guidmapping等 。
稳定性方面保障需要针对关键环节配置相关监控报警 , 设置预案并做故障演练 。
总体方案设计
方案总览
作业帮基于 StarRocks 画像系统的设计及优化实践
文章图片
大概由画像服务、实时标签接入、离线标签接入三部分组成 。
(1)画像服务主要承担标签配置管理、标签枚举值解释映射、人群圈选人群包管理、其他功能系统对接、标签数据接入配置管理及快速回滚能力等 。
(2)实时标签接入主要负责标签接入规范、cuid->guid映射及备份、标签实时入库三部分 。 通过抽象工具 , 任务可配置化完成 。
(3)离线标签接入主要负责标签接入规范、配置化接入(标签数据组装、cuid->guid映射、校验、监控、入库等) 。
StarRocks作为全场景MPP数据库 , 支持多种表模型、秒级实时分析、并发查询等能力 , 同时又具有bitmap存储结构和配套的UDF函数 , 降低了对bitmap存储、交叉、管理等方面的工程复杂程度 , 所以我们最终选用StarRocks作为标签的存储 。
根据需求场景、性能、灵活性等方面因素考虑 , 将标签信息抽象为如下几类进行存储 。 每个分类会对应一个查询模板解决不同业务场景问题 。 因读写性能、标签更新时效、幂等接入等因素考虑 , 同一个类型支持了多个StarRocks表模型 , 同一标签也可存储在不同业务类型表中 。