最新要闻
- 环球短讯!俄罗斯开发者1年拿不到钱!好好的微星AfterBurner被一场战争害死
- 盘点CES上让人耳目一新的小玩意:极具创意
- 参与美国“阿尔忒弥斯计划” 日本人将首次登陆月球:日期未定
- 2499元起 Redmi K60成了:京东好评率比iPhone 14更高
- 新动态:你能接受不?奔驰Smart精灵#1开启硬件订阅:座椅加热1299元
- 时讯:股价暴跌后!特斯拉最大华裔散户天天“炮轰”马斯克
- 环球今热点:手慢真无了 码已不全!森马羽绒/棉服大促:一百多到手
- 世界热讯:美菱推出“杀新冠冰箱”:灭杀率高达99.9% 已过权威认证
- 全球时讯:PS5主机应该横放还是竖放引热议 索尼:都可以
- 热点评!配第四代i-MMD 东风本田新款英仕派e:HEV官图发布:真大号思域
- 外观复刻iPhone 14 Pro!乐视手机S1 Pro标配8+128GB存储:自称5G小霸王
- 当前讯息:一加8钉子户上车一加11:真正上手那一刻被惊艳到了
- 每日消息!一加11成为最火爆的第二代骁龙8旗舰!李杰:友商都可以去查
- NVIDIA推出第5代MAX-Q技术:游戏本性能进一步提升
- 女子买200万豪车 亲友400箱礼花庆贺 整条街道都摆满了
- 每日热议!成功率100%!中国民营火箭谷神星一号五连胜:一箭五星
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
火山引擎 DataTester:5 个优化思路,构建高性能 A/B 实验平台
导读:DataTester 是由火山引擎推出的 A/B 测试平台,覆盖推荐、广告、搜索、UI、产品功能等业务应用场景,提供从 A/B 实验设计、实验创建、指标计算、统计分析到最终评估上线等贯穿整个 A/B 实验生命周期的服务。DataTester 经过了字节跳动业务的多年打磨,在字节内部已累计完成 150 万次 A/B 实验,在外部也应用到了多个行业领域。
指标查询的产品高性能是 DataTester 的一大优势。作为产品最复杂的功能模块之一,DataTester 的指标查询能够在有限资源的前提下,发挥出最极致的 A/B 实验数据查询体验,而在这背后是多次的技术方案的打磨与迭代。
(资料图)
本文将分享 DataTester 在查询性能提升过程中的 5 个优化思路。
01
现状及问题
1. 挑战 1:版本管理
实验指标报告页是 DataTester 系统最核心的功能之一,报告页的使用体验直接决定了 DataTester 作为数据增长和实验评估引擎在业界的竞争力。该功能具有以下特点:
① 牵连系统多、链路长:报告页涉及到控制台(Console)、科学计算模块、查询引擎、OLAP 存储引擎。整个链路包括了:DSL 到 sql 转化、后端查询结果缓存处理、查询结果的加工计算、前端查询接口的组装和数据渲染。
②实现复杂:实验指标有多种算子,在查询引擎侧中都有一套定制 SQL,通过 DSL 将算子转换成 SQL。这是 DataTester 中最复杂的功能模块之一。
02
优化思路
从一条 SQL 说起。
举一个例子,在 DataTester 中一次 AB 测试的查询分三部分逻辑。
①实时扫描事件表,做过滤
② 根据用户首次进组时间过滤出用户
③做聚合运算
需要查询详细的 SQL 代码,也可以点击展开查看详情。
printf("hello world!");SELECT event_date, count(DISTINCT uc1) AS uv, sum(value) AS sum_value, sum(pow(value, 2)) AS sum_value_squareFROM (SELECT uc1, event_date, count(s) AS value FROM (SELECT hash_uid AS uc1, TIME, server_time, event, event_date, TIME AS s FROM rangers.tob_apps_all et WHERE tea_app_id = 249532 AND ((event = "purchase")) AND (event_date >= "2021-05-10" AND event_date <= "2021-05-19" AND multiIf(server_time < 1609948800, server_time, TIME > 2000000000, toUInt32(TIME / 1000), TIME) >= 1620576000 AND multiIf(server_time < 1609948800, server_time, TIME > 2000000000, toUInt32(TIME / 1000), TIME) <= 1621439999) AND (event in ("rangers_push_send", "rangers_push_workflow") OR ifNull(string_params{"$inactive"},"null")!="true") ) et GLOBAL ANY INNER JOIN (SELECT min(multiIf(server_time < 1609948800, server_time, TIME > 2000000000, toUInt32(TIME / 1000), TIME)) AS first_time, hash_uid AS uc2 FROM rangers.tob_apps_all et WHERE tea_app_id = 249532 AND arraySetCheck(ab_version, (29282)) AND event_date >= "2021-05-10" AND event_date <= "2021-05-19" AND multiIf(server_time < 1609948800, server_time, TIME > 2000000000, toUInt32(TIME / 1000), TIME) >= 1620651351 AND multiIf(server_time < 1609948800, server_time, TIME > 2000000000, toUInt32(TIME / 1000), TIME) <= 1621439999 AND (event in ("rangers_push_send", "rangers_push_workflow") OR ifNull(string_params{"$inactive"},"null")!="true") GROUP BY uc2) tab ON et.uc1=tab.uc2 WHERE multiIf(server_time < 1609948800, server_time, TIME > 2000000000, toUInt32(TIME / 1000), TIME)>=first_time AND first_time>0 GROUP BY uc1, event_date)GROUP BY event_date
DataTester 底层 OLAP 引擎采用的是 clickhouse,根据 clickhouse 引擎的特点,主要有两个优化方向:
①减少 clickhouse 的 join,因为 clickhouse 最擅长的是单表查询和多维度分析,如果做一些轻量级聚合把结果做到单表上,性能可以极大提升。也就是把 join 提前到数据构建阶段,构建好的数据就是 join 好的数据。
②需要 join 的场景,则通过减小右表大小来加速查询。因为 join 的时候会把右表拉到本地构建 hash 表,所以必然会占用大量内存,影响性能。
1. 重点优化方案
2. 方案一:预聚合,压缩查询事件量
虽然指标很灵活,但是大多数场景用户进入报告页只会查看进组信息,实验结论,指标天级统计数据等,很少实时带条件去查询。因此,天级查询是我们主要使用场景。天级查询可以通过「预计算」加速。为了支持置信度的计算,「预计算」可以从人的粒度着手,即每天保存一条人的聚合后结果,记录下这个人在所有实验下进组之后各指标下的累积值。这样每天数据量与日活量相当,可以大大压缩总体查询量。
(1)方案详情
总体流程图:
分为如下几个关键步骤:Dump、Parse、Build、Query
Dump
即把事件 dump 到离线存储中。私有化采用 flume 来实现:
a. 自定义 timestamp interceptor 防止数据漂移
b. 使用 file channel 文件缓冲保证数据不丢失
Parse
从指标 DSL 中解析出聚合字段、聚合类型,事件名、过滤条件指标四要素,再根据这些信息生成 md5 作为 clickhouse 存储的 key。考虑到不同指标配置可能会配置相同的聚合字段、聚合类型,事件名、过滤条件,生成 md5 的目的是保证唯一防止多次聚合。聚合类型包括 count,sum,max,min,latest,distinct(暂不支持),任何算子都可以用这几个基础聚合结果计算出来。如 avg 可以通过 sum/count 来计算。
Build
离线构建最核心的部分在于自定义聚合函数(UDAF),自带的聚合函数无法满足我们的要求。
Query
即数据如何查询,通过对查询引擎增加参数控制是否走预聚合逻辑,同时针对预聚合定制了查询实现。
(2)资源使用限制
私有化场景用户机器资源是非常宝贵的,夜间也有很多定时任务在执行会争抢资源。为了保证不占用太多资源,提交任务时会对 spark 参数做控制。
以如下参数为基准,对 spark.dynamicAllocation.maxExecutors 进行控制:
driver-memory:4g
executor-memory:2g
executor-cores:2
配置梯度表:
(3)性能提升表现
4 亿事件量,100w 用户量,查询提升超过 4 倍。
3. 方案二:ab_log,减小 join 时右表的大小
(1)背景
(2)方案概览
① 从实时流中过滤出曝光事件,把用户和进组时间写进实时 clickhouse 表。
②从 clickhouse 实时表中构建出天粒度的离线用户进组信息表,每天每个用户仅有 1 条进组记录,记录了该用户该天最早的进组时间。
③查询的时候,为了获得用户首次进组时间,取 min(「实时表中该用户当天的进组时间」,「离线表实验开始到 T-1 天数据中该用户进组时间」)。
(3)提升效果
①通过天级进组表大大加速服务端实验进组人群的圈选。
②彻底解决私有化进组用户属性的隐患。
③在私有化环境可以一定程度上减少曝光事件量。在某些客户下,可减少 30%以上事件量。
4. 方案三:GroupBy 查询优化
(1)背景
DataTester 的数据查询和其他数据应用产品不同,DataTester 在数据查询时,所有的查询都会针对每一个实验版本都查一遍,而过程中中唯一的区别就在于实验版本 ID,所以和 SQL 中 GroupBy 的应用场景特别契合,通过 GroupBy 查询不仅可以极大的减少查询的数量,也可以降低多次查询造成的重复扫表,提高查询效率。
(2)优化方案
DataTester 对每个实验版本的查询语句都是类似的,只是版本 id 不同。对 DataTester 用到的所有查询类型和算子做 GroupBy 的改造,实现细节这里不做过多展开。
(3)提升效果
测试数据规模为日均一亿,7 天,3 个实验版本
查询引擎接口响应时长(取 10 次平均):
5.方案四:au 类指标优化,减少重复查询次数
(1)背景
指标查询引擎对 DataTester 的 au 类型算子都做了定制,一个指标查询会产生两条 sql,一条正常指标的查询 sql,另一条是对 any_event 的 au 的查询,在最后结果处理的时候对两条 sql 的查询结果做了一个合并,一起返回到 DataTester 的科学计算模块。但是,每次打开报告页都必定会查进组人数,它和 any_event 的 au 是同一个值,au 类型算子查询的时候无法复用进组人数的结果,而 au 查询又可以算是最慢的查询之一,降低了报告页打开的速度。
对有进组指标的算子做了缓存优化,减少重复查询。
(2)优化方案
6. 方案五:异步查询优化,解决页面超时问题
(1)背景
DataTester 报告页等一些查询数据的接口本身确实比较耗时,需要实时计算,而大部分网关都有超时限制,这个问题在私有化中尤为明显,所以对报告页的整体交互做了优化改造。
(2)方案介绍
前后端交互
服务端架构设计
(3)用户体验改进效果
① 大幅缩短请求延时,避免出现页面请求失败的情况
② 通过增加 redis 缓存,同页面的多次刷新响应时间可以控制在 100ms 左右
7. 其他优化方案
①业务逻辑优化,报告概览核心指标显著性和进组共用查询结果,去除实验版本按照核心指标显著性的排序,14 个 SQL 降至 10 个,降低 28.5%⬇️
②多维度并发控制,限制资源使用
③默认使用备查询,充分利用备节点的算力
④灵活开关多种报告的缓存,保证核心链路正常运行
03
总结
作为一站式 A/B 测试平台,火山引擎 DataTester 最核心的功能之一就是指标查询部分,它关系到产品体验和资源占用情况。而作为 TOB 领域的数据产品,DataTester 能在有限的资源下发挥最极致的产品数据体验,也是产品最为重要的竞争力之一。
本次分享了 DataTester 在报告页查询优化过程中的 5 个技术方案落地。预聚合和 ablog 是从数据构建角度减少查询数据量的角度的优化,groupby 和 au 类指标的优化是从减少并发的角度,异步查询是从产品体验角度。
查询和数据构建密不可分,DataTester 未来的产品优化也会按照“去肥”和“增瘦”两个方向进行,“去肥”是优化科学计算模块和查询引擎的整体架构,优化业务逻辑,使得报告页查询逻辑更加清晰和简洁;另一方面“增瘦”就是通过合理的数据构建和数据模型优化加速查询,同时定向对部分难点问题重点优化,比如留存、盒须快照、同期群等等。
点击跳转火山引擎A/B测试DataTester官网了解详情!
扫码进入「字节跳动数据平台」官方交流群,领取更多 A/B 测试学习资料。
-
火山引擎 DataTester:5 个优化思路,构建高性能 A/B 实验平台
导读:DataTester是由火山引擎推出的A B测试平台,覆盖推荐、广告、搜索、UI、产品功能等业务应用场景...
来源: -
环球新资讯:对话阿里云叔同:如何看待 2022 年云原生的发展,2023 年有哪些值得关注的技术?
(2022云原生实战峰会)2022年12月28日,以“原生万物云上创新”为主题的第三届云原生实战峰会在线上举...
来源: 火山引擎 DataTester:5 个优化思路,构建高性能 A/B 实验平台
环球新资讯:对话阿里云叔同:如何看待 2022 年云原生的发展,2023 年有哪些值得关注的技术?
全球新动态:字符串匹配算法综述
新资讯:网易云音乐用户画像资产治理及业务赋能
每日热议![概率论与数理统计]笔记:3.1 随机向量的分布
环球短讯!俄罗斯开发者1年拿不到钱!好好的微星AfterBurner被一场战争害死
盘点CES上让人耳目一新的小玩意:极具创意
参与美国“阿尔忒弥斯计划” 日本人将首次登陆月球:日期未定
2499元起 Redmi K60成了:京东好评率比iPhone 14更高
新动态:你能接受不?奔驰Smart精灵#1开启硬件订阅:座椅加热1299元
环球播报:软件开发入门教程网之C++ 引用
[笔记]斜率优化
HTML超文本标记语言2
时讯:股价暴跌后!特斯拉最大华裔散户天天“炮轰”马斯克
环球今热点:手慢真无了 码已不全!森马羽绒/棉服大促:一百多到手
世界热讯:美菱推出“杀新冠冰箱”:灭杀率高达99.9% 已过权威认证
全球时讯:PS5主机应该横放还是竖放引热议 索尼:都可以
热点评!配第四代i-MMD 东风本田新款英仕派e:HEV官图发布:真大号思域
世界视点!【操作系统实验/Golang】实验4:虚拟内存页面置换算法
世界时讯:Python工具箱系列(二十二)
初识Vue
环球消息!ACWING 4261. 孤独的照片
外观复刻iPhone 14 Pro!乐视手机S1 Pro标配8+128GB存储:自称5G小霸王
当前讯息:一加8钉子户上车一加11:真正上手那一刻被惊艳到了
每日消息!一加11成为最火爆的第二代骁龙8旗舰!李杰:友商都可以去查
NVIDIA推出第5代MAX-Q技术:游戏本性能进一步提升
女子买200万豪车 亲友400箱礼花庆贺 整条街道都摆满了
当前热议!无监控,不运维!深入浅出介绍ChengYing监控设计和使用
学习笔记——在IDEA中创建Maven版的web工程;框架;Mybatis简介;搭建Mybatis框架步骤
每日热议!成功率100%!中国民营火箭谷神星一号五连胜:一箭五星
今日热闻!33岁男子酗酒20年骨头坏死:13岁开始喝、每天至少半斤
动画版口碑崩盘 《三体》国产剧版过审获许可证 最快本月上线腾讯视频
世界速递!特斯拉最大散户投资者成马斯克头号反对者:连续多日公开炮轰
关注:一步一步实现若依框架--2.2实现后台限流rate_limiter
最资讯丨ACWING 4645. 选数异或
天天要闻:全球第四大汽车制造商CEO:欧洲中产阶级将选购中国汽车
清华应届硕士炮轰字节恶意低薪:月薪2万 硕士白读还倒贴
世界快看:面试官:数据库日期类型字段,需要兼容不同数据库,应该如何选择?
今日最新!ThreadLocal源码解析及实战应用
交换机二层组播配置
管理工具造成的阻塞
前沿热点:国产战机大片!电影《长空之王》定档:今年五一上映
杭州外来人口占3成 河南人数比肩本地土著 原来有历史原因
小米13系列大卖、汽车售价可达35万以上 小米高端成了:股价大涨
采埃孚新安全带:不用开空调 可提升电动车15%续航
焦点速读:3999元起 一加11首销51分钟打破所有二代骁龙8销量、销售额双记录
家用光纤宽带多少兆合适?家用光纤怎么接路由器?
招财猫的原型是什么猫?招财猫左手右手分别代表什么?
修正液的成分是什么?修正液的性质有哪些?
丁克家族是什么意思?丁克家庭的好处和坏处有哪些?
纪宝贝是什么电视剧的角色?纪宝贝是什么品种的狗?
印度首家旗舰店来了?传苹果(AAPL.US)开始招聘零售店员工
年终盘点丨最受开发者欢迎的文章 TOP20
天天快报!华硕ROG首款DP2.1接口显示器发布:无压缩4K 160Hz画质
世界热讯:车主激烈维权上演0元购!特斯拉成都门店否认:都是理性维权
重达2.4吨!美国40年前发射卫星今日坠落地球:或为朝鲜半岛
行业最低!一加Buds Pro 2首销899元:全链路延时仅54ms
【全球独家】腾讯发布未成年人春节寒假限玩通知:春节7天全开 工作日继续禁玩
京音平台-一起玩转SCRM之电销系统
全球滚动:特斯拉降价 国外车主怎么就不闹:原因发人深思
环球观速讯丨电视“套娃式充会员”吃相难看 有人呼吁建立互相兼容的会员体系
天天要闻:电子后视镜正式获批!吉利路特斯首批上车:选装费1万6
北斗三号卫星系统总设计师:北斗核心指标已超GPS
精选!极端暖冬席卷欧洲 多国冬天“入夏”:天然气价格也遭暴跌
环球热门:深拷贝、浅拷贝
6.Servlet
环球短讯!春节档电影票房乐观预测可达85亿 吴京主演《流浪地球2》领跑
每日焦点!支付宝2023年“集五福”来了 网友:两块钱的大项目
时讯:网站关停!广汽讴歌成为历史 正式退出中国市场
2023中国航天开门红!我国再次成功发射一箭三星
卢伟冰:Redmi K60卖的非常好 是2.5K-4K价位首选!
天天即时看!未来要取代iPhone!苹果AR/VR头戴设备将春季发布:原型机已发放
A16研发失败后!iOS 17首曝光:苹果挤牙膏 没重大更新让人失望
天天讯息:电源买双倍功率就中计啦!大可不必
全球观热点:用4年依旧流畅!一加11今日首销:最低12G内存 3999元起
焦点速讯:暴雪网易复合几乎不可能:不会降低标准 正和新代理谈的火热
4week-3字符串和字符
世界时讯:DVWA靶场实战(五)——File Upload
ACWING 4366. 上课睡觉
【世界速看料】NVIDIA正在开发AI优化驱动:性能飙升30%
大几千元的空气消毒机是智商税吗?这操作多少有点愣
世界信息:神奇的雌雄同体:一不小心 “老婆”变成“老公”
[1] LeetCode 刷题笔记: 两数之和 [S]
expres实现登录与修改密码
《鹿鼎记》主演时隔24年重聚:小宝的四个老婆 她几乎没变
Codeforces 1671 F Permutation Counting 题解
关注:如何优雅地校验后端接口数据,不做前端背锅侠
《中国奇谭》封神:上线仅三集 追番量破200万
红旗正式发布新能源品牌:全新LOGO 新车3秒破百
【环球新视野】学习笔记——Maven的核心概念之仓库、坐标;maven的依赖管理;Maven中统一管理版本号;Maven的继承;Maven的聚合
jmap——Java内存分析工具
全球消息!AMD锐龙7040砍掉没用的PCIe 5.0!内存翻番256GB
全球快看点丨微软Xbox老大斯宾塞盛赞索尼:无障碍手柄是对PS生态很好的补充
环球观热点:1.Maven入门
每日快播:特斯拉的好日子 到头了
全球热资讯!马斯克承诺成空谈!推特被裁员工仅获1个月工资补偿
中国空间站能量粒子探测器成功安装:自主研发 将开启10年运行
世界快报:Steam特别好评!PC策略大作《文明6》打0.9折:入正绝佳时机
20万天价酒店被抢光!春节旅游十大热门目的地公布
当前讯息:美国能源部出手 阿贡开发出全新锂硫电池:能量密度可达特斯拉4680十倍