作者:闲鱼技术-才思

预告:12月22日,ACOUG 联合创始人及多位核心专家将欢聚一堂,为“关键词解析2018技术圈的那些事儿”为主题的分享讨论,欢迎大家踊跃报名参会。

点击“阅读原文”立即报名。

详情:【感恩,回馈,展望】2018 ACOUG 年会盛大来袭!

1、业务背景

随着闲鱼业务的发展,用户规模达到数亿级,用户维度的数据指标,达到上百个之多。如何从亿级别的数据中,快速筛选出符合期望的用户人群,进行精细化人群运营,是技术需要解决的问题。业界的很多方案常常需要分钟级甚至小时级才能生成查询结果。本文提供了一种解决大数据场景下的高效数据筛选、统计和分析方法,从亿级别数据中,任意组合查询条件,筛选需要的数据,做到毫秒级返回。

2、技术选型分析

从技术角度分析,我们这个业务场景有如下特点:

  1. 需要支持任意维度的组合(and/or)嵌套查询,且要求低延迟;

  2. 数据规模大,至少亿级别,且需要支持不断扩展;

  3. 单条数据指标维度多,至少上百,且需要支持不断增加;
    综合分析,这是一个典型的OLAP场景。

2.1 OLTP与OLAP

下面简单对比下OLTP和OLAP:

最常见的数据库,如MySql、Oracle等,都采用行式存储,比较适合OLTP。如果用MySql等行数据库来实现OLAP,一般都会碰到两个瓶颈:

  1. 数据量瓶颈:mysql比较适合的数据量级是百万级,再多的话,查询和写入性能会明显下降。因此,一般会采用分库分表的方式,把数据规模控制在百万级。

  2. 查询效率瓶颈:mysql对于常用的条件查询,需要单独建立索引或组合索引。非索引字段的查询需要扫描全表,性能下降明显。

综上分析,我们的应用场景,并不适合采用行存储数据

库,因此我们重点考虑列存数据库。

2.2 行式存储与列式存储

下面简单对比一下行式存储与列式存储的特点:

行存适合近线数据分析,比如要求查询表中某几条符合条件的记录的所有字段的场景。列存适合用于数据的统计分析。考虑如下场景:一个用于存放用户的表中有20个字段,而我们要统计用户年龄的平均值,如果是行存,则要全表扫描,遍历所有行。但如果是列存,数据库只要定位到年龄这一列,然后只扫描这一列的数据就可以得到所有的年龄,计算平均值,性能上相比行存理论上就会快20倍。

而在列存数据库中,比较常见的是HBase。HBase应用的核心设计重点是rowkey的设计,一般要把常用的筛选条件,组合设计到rowkey中,通过rowkey的get(单条记录)或者scan(范围)查询。因此HBase比较适合有限查询条件下的非结构化数据存储。而我们的场景,由于所有字段都需要作为筛选条件,所以本质上还是需要结构化存储,且要求查询低延迟,因此也无法使用HBase。

我们综合考虑集团内多款列式存储的DB产品(ADS/PostgreSQL/HBase/HybridDB),综合评估读写性能、稳定性、语法完备程度及开发和部署成本,我们选择了HybridDB for MySQL计算规格来构建人群圈选引擎。

2.3 HybridDB for MySQL计算规格介绍

HybridDB for MySQL计算规格对我们的这个场景而言,核心能力主要有:

  1. 任意维度智能组合索引(使用方无需单独自建索引)

  2. 百亿大表查询毫秒级响应

  3. MySql BI生态兼容,完备SQL支持

  4. 空间检索、全文检索、复杂数据类型(多值列、JSON)支持

那么,HybridDB for MySQL计算规格是如何做到大数据场景下的任意维度组合查询的毫秒级响应的呢?

  1. 首先是HybridDB的高性能列式存储引擎,内置于存储的谓词计算能力,可以利用各种统计信息快速跳过数据块实现快速筛选;

  2. 第二是HybridDB的智能索引技术,在大宽表上一键自动全索引并根据列索引智能组合出各种谓词条件进行过滤;

  3. 第三是高性能MPP+DAG的融合计算引擎,兼顾高并发和高吞吐两种模式实现了基于pipeline的高性能向量计算,并且计算引擎和存储紧密配合,让计算更快;

  4. 第四是HybridDB支持各种数据建模技术例如星型模型、雪花模型、聚集排序等,业务适度数据建模可以实现更好的性能指标。

综合来说,HybridDB for MySQL计算规格是以SQL为中心的多功能在线实时仓库系统,很适合我们的业务场景,因此我们在此之上构建了我们的人群圈选底层引擎。

3、业务实现

在搭建了人群圈选引擎之后,我们重点改造了我们的消息推送系统,作为人群精细化运营的一个重要落地点。

3.1 闲鱼消息推送简介

消息推送(PUSH)是信息触达用户最快捷的手段。闲鱼比较常用的PUSH方式,是先离线计算好PUSH人群、准备好对应PUSH文案,然后在第二天指定的时间推送。一般都是周期性的PUSH任务。但是临时性的、需要立刻发送、紧急的PUSH任务,就需要BI同学介入,每个PUSH任务平均约需要占用BI同学半天的开发时间,且操作上也比较麻烦。本次我们把人群圈选系统与原有的PUSH系统打通,极大地改善了此类PUSH的准备数据以及发送的效率,解放了开发资源。

3.2 系统架构

离线数据层:用户维度数据,分散在各个业务系统的离线表中。我们通过离线T+1定时任务,把数据汇总导入到实时计算层的用户大宽表中。

实时计算层:根据人群的筛选条件,从用户大宽表中,查询符合的用户数量和用户ID列表,为应用系统提供服务。

人群圈选前台系统:提供可视化的操作界面。运营同学选择筛选条件,保存为人群,用于分析或者发送PUSH。每一个人群,对应一个SQL存储。类似于:

select count(*) from user_big_table where column1> 1 and column2 in ('a','b') and ( column31=1 or column32=2)

同时,SQL可以支持任意字段的多层and/or嵌套组合。

用SQL保存人群的方式,当用户表中的数据变更时,可以随时执行SQL,获取最新的人群用户,来更新人群。

闲鱼PUSH系统:从人群圈选前台系统中获取人群对应的where条件,再从实时计算层,分页获取用户列表,给用户发送PUSH。在实现过程中,我们重点解决了分页查询的性能问题。

分页查询性能优化方案:

在分页时,当人群的规模很大(千万级别)时,页码越往后,查询的性能会有明显下降。因此,我们采用把人群数据增加行号、导出到MySql的方式,来提升性能。表结构如下:

  • 批次号:人群每导出一次,就新加一个批次号,批次号为时间戳,递增。

  • 行号:从1开始递增,每一个批次号对应的行号都是从1到N。

我们为"人群ID"+"批次号"+"行号"建组合索引,分页查询时,用索引查询的方式替换分页的方式,从而保证大页码时的查询效率。

另外,为此额外付出的导出数据的开销,得益于HybridDB强大的数据导出能力,数据量在万级别至百万级别,耗时在秒级至几十秒级别。综合权衡之后,采用了本方案。

4、PUSH系统改造收益

人群圈选系统为闲鱼精细化用户运营提供了强有力的底层能力支撑。同时,圈选人群,也可以应用到其他的业务场景,比如首页焦点图定投等需要分层用户运营的场景,为闲鱼业务提供了很大的优化空间。

本文实现了海量多维度数据中组合查询的秒级返回结果,是一种OLAP场景下的通用技术实现方案。同时介绍了用该技术方案改造原有业务系统的一个应用案例,取得了很好的业务结果,可供类似需求或场景的参考。

5、未来

人群圈选引擎中的用户数据,我们目前是T+1导入的。这是考虑到人群相关的指标,变化频率不是很快,且很多指标(比如用户标签)都是离线T+1计算的,因此T+1的数据更新频度是可以接受的。后续我们又基于HybridDB构建了更为强大的商品圈选引擎。闲鱼商品数据相比用户数据,变化更快。一方面用户随时会更新自己的商品,另一方面,由于闲鱼商品单库存(售出即下架)的特性,以及其他原因,商品状态会随时变更。因此我们的选品引擎,应该尽快感知到这些数据的变化,并在投放层面做出实时调整。我们基于HybridDB(存储)和实时计算引擎,构建了更为强大的“马赫”实时选品系统。后续即将推出“马赫”的系列文章,有兴趣的同学可以关注。另外如果对本文中的具体技术实现(细节)有任何问题,请联系我们。谢谢。

参考资料:
HybridDB for MySQL介绍:

http://click.aliyun.com/m/1000027814/

本文转载自:闲鱼技术


资源下载

关注公众号:数据和云(OraNews)回复关键字获取

2018DTCC , 数据库大会PPT

2018DTC,2018 DTC 大会 PPT

DBALIFE ,“DBA 的一天”海报

DBA04 ,DBA 手记4 电子书

122ARCH ,Oracle 12.2体系结构图

2018OOW ,Oracle OpenWorld 资料

PRELECTION ,大讲堂讲师课程资料

近期文章

企业数据架构的云化智能重构和变革(含大会PPT)

Oracle研发总裁Thomas Kurian加盟Google Cloud

变与不变: Undo构造一致性读的例外情况

Oracle 18c新特性:动态 Container Map 增强 Application Container 灵活性

Oracle 18c新特性:Schema-Only 帐号提升应用管理安全性

Oracle 18c新特性:多租户舰队 CDB Fleet (含PPT)

为什么看了那么多灾难,还是过不好备份这一关?

毫秒级从百亿大表任意维度筛选数据,是怎么做到的…相关推荐

  1. 如何做到毫秒级从百亿大表任意维度筛选数据?| 技术头条

    业务背景 随着闲鱼业务的发展,用户规模达到数亿级,用户维度的数据指标,达到上百个之多.如何从亿级别的数据中,快速筛选出符合期望的用户人群,进行精细化人群运营,是技术需要解决的问题.业界的很多方案往往需 ...

  2. 毫秒级从百亿大表任意维度筛选数据,是怎么做到的.

    文章概要 1 业务背景 随着闲鱼业务的发展,用户规模达到数亿级,用户维度的数据指标,达到上百个之多.如何从亿级别的数据中,快速筛选出符合期望的用户人群,进行精细化人群运营,是技术需要解决的问题.业界的 ...

  3. 一卡顶四卡,清华推出工具包BMInf玩转百亿大模型

    最近在工业界与学术界,最热门的方向莫过于预训练语言模型.而具有百亿乃至千亿参数的大规模预训练语言模型,更是业界与学术界发力的热点. 但现在大模型的应用却有着较高的门槛,排队申请或需要付费的API.较长 ...

  4. 全球最大智能模型“悟道”首次落地:数字人+终端AI助手,支持NVIDIA GTX单卡机运行百亿大模型

    作者 | 琰琰 悟道2.0,要怎么用起来? 连创"中国首个"和"世界最大"两项记录后,悟道大模型的落地应用成为业界关心的热点话题. GPT-3的问世掀起了一股& ...

  5. 千元显卡玩转百亿大模型,清华推出工具包BMInf让模型推理轻而易举

    最近在工业界与学术界,最热门的方向莫过于预训练语言模型.而具有百亿乃至千亿参数的大规模预训练语言模型,更是业界与学术界发力的热点. 但现在大模型的应用却有着较高的门槛,排队申请或需要付费的API.较长 ...

  6. 你来我往!为了百亿大单,微软亚马逊又掐上了

    西雅图IT圈:seattleit [今日作者]Dexter 读书巨慢理事会会长 1 最近的亚马逊可谓春风得意. 在全球经济都在受到新冠疫情近乎毁灭性打击的情况下,亚马逊的电商业务反而成了受益者,订单量 ...

  7. datax从gbase8a同步上亿大表到mysql5.7中

    背景 需要从gbase8a同步一些大表到mysql5.7数据库中,gbase8a中的大表基本上是没有有效的时间戳标识,直接通过datax抽取时,会报gc错误,除非设置同步使用的内存大于表的大小,这个在 ...

  8. 7月第2周业务风控关注 |涉嫌侵犯数百亿条公民个人信息 上市公司数据堂被公安一锅端...

    易盾业务风控周报每周呈报值得关注的安全技术和事件,包括但不限于内容安全.移动安全.业务安全和网络安全,帮助企业提高警惕,规避这些似小实大.影响业务健康发展的安全风险. 1.涉嫌侵犯数百亿条公民个人信息 ...

  9. python工具方法 10 h5py批量写入文件、读取文件,支持任意维度的数据

    1.创建引入库并创建h5文件 import h5py import numpy as npfile_name='data.h5' h5f=h5py.File(file_name) 2.批量写入数据的方 ...

最新文章

  1. 如何在命令提示符下编译运行含有Package的java文件
  2. GPU Gems1 - 14 透视阴影贴图(Perspective Shadow Maps: Care and Feeding)
  3. PostgreSQL入门篇学习笔记(七)
  4. java项目添加jar包
  5. 关于BeautifulSoup写class和class_
  6. SVG可伸缩的矢量图形
  7. 什么是互联网保险平台?
  8. struts2异常处理流程_Struts2异常处理示例教程
  9. java动态编译无法导包_java动态编译整个项目,解决jar包找不到问题.doc
  10. 天线工程手册_胆大心细 专业敬业——记FPSO改装MV30项目球形天线组装工程
  11. 容器化 RDS:借助火焰图定位Kubernetes性能问题
  12. 计算机毕业论文指导,计算机毕业论文指导
  13. 求求你学学医疗保险小知识吧
  14. 中国二代居民身份证校验_编码正确性校验 java实现
  15. 应用程序操作word文件报“RPC服务器不可用,HRESULT:0x800706BA”
  16. 如何使用MScomm控件
  17. 在虚拟机上使用Ghost备份/恢复操作系统
  18. 微信小程序-百度AI语音识别——(一)
  19. 2022年国家高新技术企业认定评审最新标准及补贴政策重点,补贴10-50万
  20. android9.0官方壁纸,谷歌出品:安卓9.0原生春天主题壁纸 每一张都是谷歌的精挑细选!...

热门文章

  1. linux上开发应用程序_如何在Linux上安装软件应用程序
  2. (4)vue.js 基础语法
  3. (46)HTML网页开发流程
  4. android getresponsecode -1,getHttpResponseCode()在android 2.2中返回-1
  5. 计算机创新发展战略,计算机行业:《智能汽车创新发展战略》征求意见稿点评...
  6. python填空题及答案知乎_GitHub - HSINAN/zhihu-python: 获取知乎内容信息,包括问题,答案,用户,收藏夹信息...
  7. java long的包,long longValue()
  8. thinkpad重装系统不引导_4个步骤,轻松解决电脑重装系统【蓝屏】
  9. Kotlin——初级篇(一):最详细的环境搭建
  10. 自制反汇编逆向分析工具 迭代第六版本 (一)