首页 文章 精选 留言 我的

精选列表

搜索[全场景互联],共10000篇文章
优秀的个人博客,低调大师

OLAP引擎Clickhouse在abtest场景下的优化

引言 A/B测定义 A/B 测试以数据驱动为导向,可以实现灵活的流量切分,使得同一产品的不同版本能同时在线,通过记录和分析用户对不同版本产生的行为数据,得到效果对比,最大程度地保证结果的科学性和准确性,从而帮助人们进行科学的产品决策。 基于用户行为数据计算不同版本的指标数据,是评估实验结果的唯一依据。 指标产品设计 图1. 新增指标 指标系统产品设计上采用了指标注册的方式,用户可以在自己的业务域和业务线下进行指标注册,注册需要指定指标计算公式(SQL),指标SQL必须遵守SQL模板,并支持自定义维度(自动注册维度/关联维表)。分析层面上,用户可以查看固定与预计算好的指标,也可以进行指标的多维分析。 产品需求上,需要计算当日以及累计(实验开始时间~前一天)的样本、指标。 指标技术架构 ​ 图2. 指标设计架构图 多个实验采取并行计算,单个实验多个指标采取串行计算。 单个实验需要计算的数据如下: 图3. 实验计算数据 指标计算的特点在于:对于每一个实验,需要先计算样本,指标是架设在样本之上的指标,基础指标P值的计算需要依赖样本和指标,复合指标P值的计算需要基于分母重建样本。对于每个实验来讲,样本可能是变化的,用户可以自定义样本,也可以选择分流服务日志作为默认兜底样本。 指标计算优化 阶段一:引擎和架构优化 计算引擎Spark:基于性能和成熟度的考量,选择Spark作为核心计算引擎,它相对Hive的优势就不赘述了。 OLAP引擎Clickhouse:指标分析需要基于明细数据进行多维复杂分析,目前的成熟引擎都可以满足,选择CK的重要原因是:1> CK的性能和成熟度已经得到验证 2> 内部有CK集群,方便我们直接使用。 计算方式:多个实验并行计算,单个实验内部的多指标串行计算。实验之间关联性较小,并行计算时合适的。单个实验内部,多个指标关联性较强,如复合指标,需要先计算基础指标,才可以复合计算,串行计算是合理的。在实现上的话,是通过调度shell脚本动态循环实验完成的。 实现方式:单个实验的计算是通过一个通用的Spark程序来完成的,离线调度任务起来的时候,读取实验指标的配置,先算明细,再算指标值。 AB平台上线初期,实验和指标数量较少(10+实验,50+指标),基本可以满足需求,整体计算时间大约是2~3个小时。 平台在运行半年之后,随着实验数量的增多,整个时间延长到了5~6个小时,并行度已经增加到10,单个任务的资源增加到100core, 800G内存,怎么优化? 阶段二:计算模型优化 我们抓取一个典型的广告实验,打印每个指标各个阶段的消耗时长,经过对计算的每个过程执行时间分析,发现花在样本和指标累计值计算上的时间特别长。AB指标的累计值计算规则是从>=实验开始运行日期<=计算日期,指标定义sql会要求必须输入时间字段,程序会自动进行判断和日期的处理,如果一个实验运行了3个月,那需要扫描3个月的数据进行计算,数据量较大会造成计算效率差、计算时间很长。 我们统计了3个月内已关闭实验的运行时长: 图4. 实验运行时长统计 从上图看到,大于1个月的实验占总实验数接近60%,比例是比较高的。 如何优化累计计算呢? 之前的计算模型: 图5. 原计算模型 这个计算模型的优点是相对独立,可随意计算任意一个日期的累计值;缺点是1>需要扫描的数据量比较大2>计算不够准确:将样本发生时间在指标时间之后的数据也计算进去了,结果会出现轻微误差,举例来讲:5月1号用户发生了转化,但是5月2号用户才参加实验,此算法会把这样的数据算做实验带来的转化。 优化后的模型: 图6. 新计算模型 此计算模型的优点:1>累计计算的性能有了大幅度的提升,不再随着时间的增长,数据计算越来越慢的情况出现;2>计算结果更加准确。缺点是:第N天的累计计算依赖于第N-1天的累计明细,复杂程度提升了。 经过此优化之后,每个指标的计算时间相对可控,不再出现时间特别长的实验指标了。整体的计算时长保持在3个小时左右。 阶段三:率指标批量优化 经过阶段二的优化之后,整体满足50+实验,200+指标的计算,单个实验(5个指标)的整体计算时长可稳定在40分钟左右。 好景不长,指标计算又面临新挑战:年初网校资源管控平台整体对接AB之后,实验数直线上升,实验数达到每天150+,指标数600+,整体的计算时间长达10个小时,如何优化? 通过对实验和指标数据进行分析,发现通过从资源管控平台过来的实验,默认都勾选了固定的几个指标,相当于同一个指标在N个实验里出现,那是否可以对单个指标批量计算实验数据呢? AB指标计算在设计时之所以会设计成单个实验串行,多个实验并行的方式,原因是每个实验允许用户自定义样本,未自定义才会使用平台分流日志兜底。AB平台适配了多种类型的指标,批量计算适合的指标是:指定定义SQL中本身包含了实验名和组名,并且属于基础率指标,即无需和样本进行关联。 图7. 率指标优化方案 此方案上线之后,平台大部分的实验都可以基于此方案进行批量计算,加快执行效率。整体指标计算的时间缩短到5个小时,提升了一倍的性能。 阶段四:均值指标批量优化 阶段三是针对率指标的批量优化,但是系统中存在不少的均值指标,被多个实验勾选,部分指标计算比较复杂,即使计算单天的数据,计算时间也需要半个小时,如: 图8. 指标SQL 这个是指标SQL,实际计算当中还需要再关联样本,计算基于样本的均值明细和均值,整个计算会变得比较复杂,单次计算时间大约在半个小时。还能怎么优化呢? 方案一: 我们采用spark的checkpoint机制,将首次计算的明细数据通过checkpoint缓存起来,这样计算均值、p值、置信区间就可以直接用缓存的明细数据进行计算。 实施之后,发现整体的计算时长有降低,但是由于checkpoint会涉及到把数据写入hdfs,无形中将spark退回到了Hive的方式,整体有提升,但是不是很明显。 方案二: 能否像阶段三那边,批量计算缓存到CK呢? 是可以的,模型会复杂一些。 图9. 均值指标优化方案 此方案的核心在于:指标sql会先计算得到临时明细数据,在计算指标明细时,直接从CK中获取,依赖于Spark的RDD跨数据源的能力,实现计算时的动态选取,最终明细数据再回写CK。 总结 AB测指标计算优化之后,150+实验、600+指标,整体的计算时长保持在2~3个小时,最重要的是随着实验和指标的增加,整体的计算时长增加是可控的,不会几何级数的增长,达到了我们优化的效果。 想要了解更多关于教育行业的技术干货可扫码下方二维码加入好未来官方交流群

优秀的个人博客,低调大师

Elasticsearch 字段类型之 Range 经典应用场景

作者介绍: 李猛(ynuosoft),Elastic-stack 产品深度用户,ES 认证工程师,2012 年接触 Elasticsearch,对 Elastic-Stack 开发、架构、运维等方面有深入体验,实践过多种 Elasticsearch 项目,最暴力的大数据分析应用,最复杂的业务系统应用;业余为企业提供 Elastic-stack 咨询培训以及调优实施。 现状背景 背景需求 产品信息,数据量在几个 TB 级以上,每种工业产品都有大量的标签信息,标签信息多数属于数值类型,且是属于范围那种数据,如某安防头盔尺寸是 L 码,配合适合范围55cm~65cm,对于此种数据查询,若标签属性较少,还可以走传统的数据库索引查询,若标签属性很多,则显然很吃力。 原有方案 企业技术负责人入行IT很早,原始的技术栈组合是 Sqlserver+Clucene 组合,原始工业产品信息存储在数据库中,搜索查询走 Clucene,有很多问题,如下: • 自主包装 Clucene 核心库,框架与业务代码深度耦合,单次需求变更都需要发布版本,不具备稳定性• 索引实时更新几乎没有,属于离线更新,且更新一次周期很长• Clucene 版本很旧,对于搜索的支持还是早期分词阶段,仅支持倒排索引• 对于范围搜索,采用的是分词方式实现,不能做到精确的范围搜索,这个是最核心迫切需要的功能• 基于 Clucene 开发的搜索应用 ,索引数据太大,客户花很多精力实现分布式,且效果不理想。 技术实现 相比传统关系型数据库,Elasticsearch 实现的方式更加直接高效。 Range类型设置 Elasticsearch 支持多种范围类型 • 数值类型• 日期类型• IP地址类型 若在关系数据库中则每个标签属性需要2个字段表示范围值。 Range数据填充 填充范围数据,有多种表达式• 大于,gt• 小于,lt• 大于等于,gte• 小于等于,lte Range数据查询 查询语法很简单,不过查询的关联关系有几种 • 相交,查询条件的范围与字段数据范围有交叉,默认使用• 包含,查询条件的范围值,包含字段的数据范围值• 反包含,与包含相反,查询条件的范围值包含在字段的数据范围之内。 若在关系数据库中查询相交则需要2组表达式合并才可以,若多个标签属性同时查询,则更复杂。 技术原理 在跟客户企业沟通中,发现比较重要的信息是,技术负责人对于搜索领域的知识认知比较陈旧,Lucene 发展早已不仅仅是倒排索引,已经支持了很多索引算法,且应用领域也早就突破分词搜索,Elastic 产品版本近年更新很快,相应的 Lucene 也一样。 为什么选择 Elasticsearch 替代关系型数据库做范围查询最合适呢?原因如下: 产品功能 Elasticsearch 从 2016 年引入了 BKD 树算法,在构建索引时会依据字段类型设置不同的算法实现,无需要人工干预,只要设计正确的类型,如下 • 若是字符类型的,基于 Inverted Index 构建索引• 若是数值类型,基于 BKD-Tree 构建索引 算法介绍 • Bkd-Tree 作为一种基于 K-D-B-tree 的索引结构,用来对多维度的点数据 (multi-dimensional point data) 集进行索引。关于构建 BKD-Tree 过程不在本文探讨范围内,详细可以查阅更专业的论文。• 从前面客户需求描述得到,客户的工业产品信息有很多范围类型的标签属性,在 Elasticsearch 中,仅需要构建一个索引即可满足高效查找,且默认是所有标签属性自动构造索引。• 想想看若基于传统关系型数据库实现,每标签属性都需要至少 2 个字段,且多个标签属性要任意组合查询,不能通过一个索引实现,需要创建很多索引,查询时还必须保持最左原则;• BKD-Tree 索引查询效率比关系型数据库的 BTree 更胜一筹。 结语 经验总结 • Elastic 核心基于 Lucene,功能发展非常成熟,普通用户没有必要基于 Lucene 自主开发搜索应用,只需要关注自己的业务实现。• 数据产品的竞争更多的是产品背后实现算法的竞争,对于我们来说需要经常更新自己的知识体系,选择最合适的技术方案响应变化。• DB 与 ES 混合应用已经成为当前潮流,Elastic 已经成为当前查询应用标配• ES 用的好,下班必须早 声明:本文由原文作者“李猛”授权转载,对未经许可擅自使用者,保留追究其法律责任的权利。 【阿里云Elastic Stack】100%兼容开源ES,独有9大能力,提供免费X-pack服务(单节点价值$6000) 相关活动 更多折扣活动,请访问阿里云 Elasticsearch 官网 阿里云 Elasticsearch 商业通用版,1核2G ,SSD 20G首月免费阿里云 Logstash 2核4G首月免费

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册