在大数据处理和应用场景中经常需要从亿级甚至十亿级会员中搜索出符合特定标签的会员。很多企业都会使用 HBase 或者 Hive + Hadoop 的方式,这样的方式查询效率非常慢,在标签非常多的情况下计算,更是让人无法忍受。这里我们介绍一种 Greenplum + Roaringbitmap 的组合使用方案,亿级甚至十亿级会员万级标签的条件下查询毫秒级出结果。

业务系统的场景图如下。

业务系统场景图

数据从业务系统经过处理后流进 OLAP 分析平台,OLAP 平台的底层支持就是使用 Greenplum + Roaringbitmap。 Greenplum 是一个分布式大数据平台数据库,基于 MPP 架构的模式来达到快速分析效果的。 关于 Greenplum 的官方介绍:About the Greenplum Architecture( http://gpdb.docs.pivotal.io/5160/admin_guide/intro/arch_overview.html )。

Roaringbitmap 是压缩的 bitmap 的一种实现,参考文档:RoaringBitmap/RoaringBitmap( https://github.com/RoaringBitmap/RoaringBitmap )。

如何实现?

具体实现请参照如下步骤。

实验硬件配置

  1. Master 1 台,
  2. Segment Host 2 台, 3 Segments 每台Host
  3. CPU: 2.40GHz 32 cores
  4. Memory: 128G
  5. Disk: SATA 1T

实验用户表和用户标签表schema

用户表schema

用户标签表schema

参考步骤

2 亿会员数据导入GP,耗时60s

GP 分区影响:分区后查询效率提升 5-10 倍

创建用户标签表:

初始化标签:耗时分钟级别

查询效率:对会员表使用 count 查询,耗时8s,使用 Roaringbitmap 查询,耗时100毫秒

占用空间:平均一个标签包含客户数500万, 占用空间12M,10万标签总存储空间 10M * 12M = 120G

关于存储空间,将2亿会员全部设定为一个标签,查询该标签后,存储需要25M左右。

感谢阿里德哥,Talkingdata 的 Zeromax 提供的文档和源代码。

该实现是基于以上两位给出的方案和源代码修改而来,如果完全照搬 digoal/blog 这里提的方案,在聚合查询时,Greenplum 会有一些问题。

关于作者:周长跃
目前就职于深见网络,为高级技术总监,之前在华为和腾讯工作很多年。


参考文档:

  1. digoal/blog( https://github.com/digoal/blog/blob/master/201801/20180127_01.md )
  2. zeromax007/gpdb-roaringbitmap( https://github.com/zeromax007/gpdb-roaringbitmap )

arcpy实现空间查询_「实战系列」GP+Roaringbitmap,亿级会员十万级标签毫秒级查询...相关推荐

  1. java8 lambda maplist排序_「java8系列」流式编程Stream

    前言 「Java8系列」神秘的Lambda 「Java8系列」神奇的函数式接口 继上两篇之后,本文已经java8系列的第三篇了.本篇文章比较长,但我希望大家都能认真读完.读不完可以先收藏,在找时间读. ...

  2. java8堆内存模型_「GC系列」JVM堆内存分代模型及常见的垃圾回收器

    1. 内存分代模型 为什么要说JVM的内存分代模型呢,因为内存分代和垃圾回收器的运行是有关系的. 现在大部分用到的垃圾回收器在逻辑上是分代的,除了G1之外的其他垃圾回收器在逻辑上和物理上都是分代的. ...

  3. flask中文文档_「Flask系列」 初识Flask

    引子 作者有多年的编程打杂经验,之前一直参与基于Java的各种项目以及产品规划与设计,后因自己创业维持一家小公司,有些项目与产品,想降低开发成本,故在公司内部推行基于Python Flask的后端开发 ...

  4. mongdb 建立了索引唯一性还能重复插入?_「数据库系列」Postgres性能调优——Index...

    在本文中,我们将探讨如何通过使用Explain和Analyze来分析慢查询,以及使用索引来修改和增强查询时间来解决慢查询. Postgres支持在表上使用各种索引,以加快查询速度. 多列索引 多列B树 ...

  5. 中间表该怎么查询_「日语四级」日语四级准考证号忘了怎么查成绩

    首先,日语四级成绩查询是必须有用到日语四级准考证号的,那么没有准考证号我们一定要找回日语四级准考证号码,那你知道日语四级准考证号忘了怎么查成绩吗?接下来小编告诉 首先,日语四级成绩查询是必须有用到日语 ...

  6. python文件之间的相互调用_「Python 系列」 Python 生成器函数详解

    Python的生成器函数提供了一种强大的机制来管理数据和计算资源,但是对于Python的新手来说,它们不一定直观.在本文中,我将分解生成器的机制,同时还介绍我希望是一个有启发性的示例:用于管理和流传输 ...

  7. golang 接口_「Golang系列」 深入理解Golang Empty Interface (空接口)

    空接口可用于保存任何数据,它可以是一个有用的参数,因为它可以使用任何类型. 要理解空接口如何工作以及如何保存任何类型,我们首先应该理解名称背后的概念. 接口 这是Jordan Oreilli对空接口的 ...

  8. mysql显示表已存在_「Docker系列」 如何在Docker中部署MySQL数据库?

    Docker为部署和测试应用程序和数据库提供了许多优势,这些应用程序和数据库是应用程序不可或缺的一部分,因此很值得学习如何在Docker容器中部署和运行数据库. 本文中,我们会重点关注如下重点: 为M ...

  9. springboot配置文件加载顺序_「SpringBoot系列」配置文件加载优先级解析

    SpringBoot提供了外部分配置功能,可以使用属性文件(properties).YAML(yml)文件.环境变量和命令行参数来进行处部参数配置,并t以特定的顺序来处理配置,以便于允许合理的覆盖值. ...

最新文章

  1. python怎么读取txt文件数据保存数组中-python将txt等文件中的数据读为numpy数组的方法...
  2. 程序员最喜欢用的在线代码编译器,什么?你竟然不知道!可以在网页敲代码,运行调试!
  3. AWS 人工智能黑客马拉松正式开启!用实力演绎科技向善!
  4. Spring boot Scheduled 配置
  5. SpringCloud工作笔记041---com.fasterxml.jackson.databind.ObjectMapper的使用
  6. JAVA day06 继承,super,方法的重写,抽象类
  7. 12.PHP-FPM
  8. java过滤空号了停机号_手机空号、停机、注销,空号检测为你去除无效号码
  9. matlab 取模二和,取模(mod)与取余(rem)的区别——Matlab学习笔记
  10. LSB算法修改了原始图像的哪些值--底层分析
  11. E. Yet Another Array Counting Problem
  12. BLE 怎样添加 Characteristic
  13. super 和 this
  14. python的PIL库部分模块函数
  15. 从特斯拉到爱因斯坦,物理学家为何钟情于猫
  16. unity3d 骨骼模型武器绑定
  17. 《微信小程序》初识微信小程序
  18. 【C语言-嵌入式】‘a0x7f‘代表什么意思?
  19. dind(docker in docker)镜像-使用Docker学习Docker
  20. 计算机组成原理:运算方法和运算器

热门文章

  1. P1010 幂次方 P1022 计算器的改良
  2. Docker 限制容器资源
  3. WPF中DatePiker值绑定以及精简查询
  4. E_FAIL (0x80004005) MachineWrap
  5. MySQL查询优化--细节理论
  6. Python选择结构中多条件测试的简化写法
  7. Python批量爬取名字中带有中文的pdf文件
  8. Python回文判断代码优化与6个思考题
  9. Python扩展库scipy.misc中图像转换成pillow图像
  10. 设置负数_合同到期提示设置,还在手动计算就out了,学会today函数一键搞定