更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群
 
据QuestMobile报告显示,移动互联网已经进入了下半场,在使用人数和使用时长方面已经没有明显增长,互联网已经流量趋于饱和。
 
作为广告投放主要阵地,由于互联网平台流量红利逐渐消退,越来越多的广告企业和从业者开始探索精细化营销的新路径,取代以往的全流量、粗放式的广告轰炸。精细化营销意味着要在数以亿计的人群中优选出那些最具潜力的目标受众,这无疑对提供基础引擎支持的数据仓库能力,提出了极大的技术挑战。
 
在人群圈选分析中, 分析师一般利用各种标签组合,挑选出最合适的人群,进而完成广告推送,达到精准投放的效果。但由于人群查询在不同标签组合下的结果集大小不同,在一次广告投放中,分析师需要经过多次的逻辑调整,以获得"最好"的人群包。抖音集团拥有广泛的广告投放场景,在日常实践中,我们发现以下痛点问题:
 
  • 首先,数据预估。广告主需要对选定的人群组合进行预估,以便判断投放情况并确定投放预算。但广告平台用户越来越多,有的平台DAU达到上亿,使得人群包数据量过大,技术上只能采用1/10抽样存储,将导致10%误差。
  • 其次,性能问题。为了保证人群圈选精准度,广告主往往会设定多样、复杂的人群圈选条件,导致底层计算逻辑复杂,比如单次计算可能包含几百,甚至上千个人群包。Hive和Elasticsearch等方案在处理大数据量时,查询速度慢。如果研发人员查询某个广告主的所有用户,该方案需要扫描整个用户库,整个过程需要几分钟甚至几个小时,无法满足广告主实时性要求。
  • 最后,存储问题。Hive和Elasticsearch等方案需要额外的索引结构,使得存储空间变大,导致成本增加。
 
在以往,研发团队通常使用两种方案来解决以上问题:
方案一:将每个人群包存储为一个Array类型的数据结构,每次查询需要从Array中找到某一个特定ID。
方案二:使用一个表来存储用户ID,在查询的时使用In/Join计算多个人群的交集。
 
经过内部长期使用经验,无论是方案一或方案二,都存在当数据量逐渐增大,查询速度无法满足实时分析需求的问题。基于高性能、分布式特点,ClickHouse可以满足大规模数据的分析和查询需求,因此研发团队以开源ClickHouse为基础,研发出火山引擎云原生数据仓库ByteHouse,并在其中定制一套处理模型——BitEngine,用于解决集合的交并补计算在实时分析场景中的性能提升问题。
 
据介绍,BitEngine是一个高效集合数据处理模型,底层基于MergeTree Family存储引擎,并在此基础上引入了BitMap64类型,开发了系列相关运算函数。BitEngine提供的BitMap64类型适合表达具有特定关系的大量实体ID的集合,将集合的交并补运算转化为bitmap之间的交并补运算,从而达到远超普通查询的性能指标。
 
那么,BitEngine如何应用在人群圈选场景中?举个例子,广告主需求为圈选出“人群包A”和“人群包B”的交集人群,完成广告精准投放。
 
人群包情况:
  • 人群包A = [10001, 20001,30001,40001,50001],人群包B = [10001, 20001,20002,20003,20004]
期望结果:
  • 通过BitEngine计算A&B = [10001, 20001]
 
首先,人群包按照一定规则划分为多个区间,任意两个区间之间的人群包没有交集,由BitEngine保障数据的读取和计算是严格按照区间进行;其次,BitEngine在数据读取时会为每一个文件构建一个读任务,由一个线程调度模块完成整个任务调度和读取;最后,BitEngine完成所有中间结果计算后,按照结果的输出要求做一次数据合并,由此完成交集计算。已上线业务的测试表明,相比普通和Array或者用户表方式,BitEngine在查询速度上有10-50倍提升。
 
BitEngine上线前后查询耗时监控
 
BitEngine不仅仅在抖音集团海量广告投放场景中使用,目前更是集成在火山引擎云原生数据仓库ByteHouse中对外输出。火山引擎ByteHouse主要为用户提供极速分析体验,能够支撑实时数据分析和海量数据离线分析,具备便捷的弹性扩缩容能力,极致分析性能和丰富的企业级特性,目前已经与中国地震台网中心、海王集团、莉莉丝游戏、极客邦科技等诸多行业企业达成合作,深度助力各个行业数字化转型。
 
点击跳转火山引擎ByteHouse了解更多
 

查询速度最高提升50倍!火山引擎ByteHouse在广告投放领域实践分享的更多相关文章

  1. 高性能、快响应!火山引擎 ByteHouse 物化视图功能及入门介绍

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 物化视图是指将视图的计算结果存储在数据库中的一种技术.当用户执行查询时,数据库会直接从已经预计算好的结果中获取数据 ...

  2. 通过非聚集索引让select count(*) from 的查询速度提高几十倍、甚至千倍

    通过非聚集索引,可以显著提升count(*)查询的性能. 有的人可能会说,这个count(*)能用上索引吗,这个count(*)应该是通过表扫描来一个一个的统计,索引有用吗? 不错,一般的查询,如果用 ...

  3. 50倍时空算力提升,阿里云RDS PostgreSQL GPU版本上线

    2019年3月19日,阿里云RDS PostgreSQL数据库GPU规格版本正式上线,开启了RDS异构计算并行加速之路.该版本在RDS(关系型数据库服务)的云基础设施层面首次完成了与阿里云异构计算产品 ...

  4. 查询效率提升10倍!3种优化方案,帮你解决MySQL深分页问题

    开发经常遇到分页查询的需求,但是当翻页过多的时候,就会产生深分页,导致查询效率急剧下降. 有没有什么办法,能解决深分页的问题呢? 本文总结了三种优化方案,查询效率直接提升10倍,一起学习一下. 1. ...

  5. oracle 索引提升查询速度, in 和 exist 效率

    做记录: 今天有一个有153万条数据的表,发现查询很慢: select count(y) as transfereeNum,x from t_ast_subject_invest_order GROU ...

  6. 如何将 iOS 工程打包速度提升十倍以上

    如何将 iOS 工程打包速度提升十倍以上   过慢的编译速度有非常明显的副作用.一方面,程序员在等待打包的过程中可能会分心,比如刷刷朋友圈,看条新闻等等.这种认知上下文的切换会带来很多隐形的时间浪费. ...

  7. nginx缓存静态资源,只需几个配置提升10倍页面加载速度

    nginx缓存静态资源,只需几个配置提升10倍页面加载速度 首先我们看图说话 这是在没有缓存的情况下,这个页面发送了很多静态资源的请求:   1.png 可以看到,静态资源占用了整个页面加载用时的90 ...

  8. Web 应用性能提升 10 倍的 10 个建议

    转载自http://blog.jobbole.com/94962/ 提升 Web 应用的性能变得越来越重要.线上经济活动的份额持续增长,当前发达世界中 5 % 的经济发生在互联网上(查看下面资源的统计 ...

  9. Elasticsearch Reindex性能提升10倍+实战

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484134&idx=1&sn=750249a ...

  10. 并行查询提高sql查询速度

    新项目在使用Oracle开发中遇到测试库千万级数据导致数据慢,除去加索引和存储过程可以明显提速外,使用并行也可以提速 select /*+parallel(a,8)*/ a.* from a 加上/* ...

随机推荐

  1. 程序是如何在计算机上被执行的?(下篇:cpu工作原理)

    本文接上文程序是如何在计算机上被执行的?(上篇:软件部分),主要内容是机器语言如何在计算机硬件上运行,关于逻辑门,加法器,布尔运算,亦即,cpu的工作原理. 1.逻辑门 以下图片是<三体> ...

  2. Kafka基本原理、生产问题总结及性能优化实践

    Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量 ...

  3. Util应用框架基础(一) - 依赖注入

    本节介绍Util应用框架依赖注入的使用和配置扩展. 文章分为多个小节,如果对设计原理不感兴趣,只需阅读基础用法部分即可. 概述 当你想调用某个服务的方法完成特定功能时,首先需要得到这个服务的实例. 最 ...

  4. Python 既是解释型语言,也是编译型语言

    哈喽大家好,我是咸鱼 不知道有没有小伙伴跟我一样,刚开始学习 Python 的时候都听说过 Python 是一种解释型语言,因为它在运行的时候会逐行解释并执行,而 C++ 这种是编译型语言 不过我今天 ...

  5. rt-thread Env 预处理配置方法

    简介 rt-thread 是我非常喜欢的一款RTOS,近期在使用Env更新工程的时候发现,keil MDK 中的预处理型号和器件型号不符. 这就导致我每次更新工程后都需要进入keil MDK手动修改一 ...

  6. this.$router 与this.$route的区别

    this.$router是Vue-Router的实例,需要导航到不同路由则用this.$router.push方法 this.$route为当前路由的跳转对象,包含当前路由的name.path.que ...

  7. windows下tomcat开机自启动

    在Windows下,可以通过以下步骤将Tomcat设置为开机自启动: 1. 打开Tomcat安装目录:通常情况下,Tomcat的安装目录位于`C:\Program Files\Apache Softw ...

  8. 记一次解决RestTemplate和HttpClient请求结果乱码的问题

    调用一个接口,发送POST请求,浏览器和Postman均返回正常,代码中用RestTemplate和HttpClient均返回乱码 开始一直以为是编码问题导致,网上查了解决方法,也看了源码,都不对症 ...

  9. Java+Selenium爬取高德POI边界坐标

    一.写在前面 关于爬取高德兴趣点边界坐标网上有几篇文章介绍实现方式,总的来说就是通过https://www.amap.com/detail/get/detail传入POI的ID值获取数据,BUT,如果 ...

  10. [NOI online22提高A] 丹钓战

    题目描述 有 \(n\) 个二元组 \((a_i, b_i)\),编号为 1 到 n. 有一个初始为空的栈 SS,向其中加入元素 \((a_i, b_i)\) 时,先不断弹出栈顶元素直至栈空或栈顶元素 ...