大规模分布式数据库标签场景应用_第1页
大规模分布式数据库标签场景应用_第2页
大规模分布式数据库标签场景应用_第3页
大规模分布式数据库标签场景应用_第4页
大规模分布式数据库标签场景应用_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 扬帆起航苏宁大规模分布式数据库标签场景应用目录海量用户下精准营销的挑战roaringbitmap在圈人场景中的作用PostgreSQL + roaringbitmap最佳实践如何用分布式PG支撑百亿标签实时查询2如何快速找到目标营销人群(圈人)?精准基于准确的用户画像实时实时查询满足条件的目标人群灵活多变的查询条件组合用户画像的实时更新可扩展支撑数亿甚至数十亿的用户规模支撑百万,亿,甚至百亿/千亿规模的标签3常规技术方案的短板方案问题Hive由于每次查询都需要对亿级的用户表做全量扫描,资源 消耗极大,响应时间很长Spark+ElasticSearch利用ES的索引技术结合并行处理,查询性能比

2、Hive有几 十倍的提升;业务上经常需要新增标签(字段),导致必须重新灌全量ES 数据,非常耗时。曾经用过的方案4参考:https:/article/9*dSWwPT6UqSH1LSeNzq目录海量用户下精准营销的挑战roaringbitmap在圈人场景中的作用PostgreSQL + roaringbitmap的最佳实践如何用分布式PG支撑百亿标签实时查询5从搜索“人”到搜索“标签(人群)”用户ID性别城市1男南京2女北京标签类型标签值用户ID集合性别男1,3,5,6,.性别女2,4,7,8城市南京1,4,17,城市北京2, 17,98搜”人”搜”标签”记录数十亿级百万级索引数几十,上百一个

3、新增标签修改全量记录仅插入新标签记录计算方式组合条件过滤“人群”集合的交并差运算两种处理方式的对比6如何存储“人群”集合?Bitmap适合大集合的交并差运算roaringbitmap是一种已被业界广泛使用的高效的bitmap压缩算法,使 用者包括Elasticsearch,Durid,Hive,Spack,InfluxDB等,详见 /注: Elasticsearch在查询时内部用roaringbitmap临时存储不同倒排索引的结果集做交并运算。7Roaringbitmap的存储格式Roaringbitmap 将32位的整形拆分成高16位和低16位,高16位作为容器的key,低16位作为valu

4、e存储在3种不同的 容器中。每个容器最多存储65536个值,最多有65536个容器。每种容器存储方法不同适用于不同场景容器类型存储形式容器大小容量容器转换Array有序的short数组基数*2Byte4096基数超过4096时自动转换为Bitset容器Bitset8KB大小的bitset,每个值对应一个特定的bit位8KB65535基数低于4096时自动转换为Array容器runRLE(Run Length Encoding行程长度编码)格式,由成 对的short型value+length组成。比如10,11,12,13压缩为10,34B128KB65535调用run优化且run格式存储占用空

5、间更小时实施转换8不包含RUN容器时的序列化格式cookie(固定为12346)sizekey1card1-1offset1container1container2444N4NArray容器:short数组BitSet容器:8KB的bitset每个值平均占用存储空间估算:基数/范围= 1/13 :使用Bitset容器,每个数值占用范围/基数 bit最糟糕的情况下,每个值都分布在不同的容器中,平均 1个值占用10字节。9包含RUN容器时的序列化格式cookie(固定为 12347)size - 1bitmapOfRunkey1card1-1offset1container1container24

6、(N+7)/8(所有run容器对应的bit位设置为1,其它为0)4N4N(可选,N4时没有)Array容器:short数组BitSet容器:8KB的bitsetRun容器: 2+ 4*run个数n_runvalue1length1value2length210参考:/RoaringBitmap/RoaringFormatSpec/目录海量用户下精准营销的挑战roaringbitmap在圈人场景中的作用PostgreSQL + roaringbitmap的最佳实践如何用分布式PG支撑百亿标签实时查询11pg_roaringbitmap插件基于gpdb-roaringbitmap并进行了功能增强(

7、操作符,函数,并行聚合)支持PostgreSQL 10,1112pg_roaringbitmap安装从github下载pg_roaringbitmap编译并安装插件登录到目标数据库安装扩展su postgres makesudo make install13create extension roaringbitmappg_roaringbitmap使用示例(部分功能)Bitmap Calculation (OR, AND, XOR, ANDNOT)Bitmap Aggregate (OR, AND, XOR, BUILD)CardinalitySELECT roaringbitmap(1,2,

8、3) | roaringbitmap(3,4,5);SELECT roaringbitmap(1,2,3) & roaringbitmap(3,4,5);SELECT roaringbitmap(1,2,3) # roaringbitmap(3,4,5);SELECT roaringbitmap(1,2,3) - roaringbitmap(3,4,5);SELECT rb_or_agg(bitmap) FROM t1; SELECT rb_and_agg(bitmap) FROM t1; SELECT rb_xor_agg(bitmap) FROM t1;SELECT rb_build_ag

9、g(e) FROM generate_series(1,100) e;SELECT rb_cardinality(rb_build(1,2,3);14pg_roaringbitmap性能参考测试SQL:select rb_cardinality(rb_or_agg(bitmap) from bitmaptb数据量bitmap基数(注1)整形范围表大小(字节)查询时间(ms)平均记录大小(字节)平均每整形占 用空间(字节)并行度计算速度(次/core/秒)1000000011w5217894401450.932525223446061 10000000110w5217894401442.0055

10、25223467394 1000000011000w5217894401439.639525223473093 10000000110亿5217894401463.23525223417098 10000000101w6826721281407.813686.823551608 100000001010w7656079361868.86777.722675428 10000000101000w13429555204377.3413413.421142246 100000001010亿14124154884696.17814114.121064696 1000000010001w20480000

11、00010334.64120482.02483810 10000000100010w2827771084821462.61128282.82232963 1000000010001000w41931038720106924.88441934.2246762 10000000100010亿1.04045E+11531798.6951040410.429402 100010000001000w1302405120734.80813024051.311361 1000100000010亿22009856006086.90722009862.21164 1000100000001000w(注2)130

12、2405120714.31613024050.1311400 10001000000010亿2076681011241784.536207668102.1124注1)该基数值只是插入到bitmap中的随机数,实际基数在测试数据去重后小于该数注2)实际基数在测试数据去重后大概是500w,实际每整数占用大小应该大约是0.26注3)测试环境:16C/128G/3000G SSD物理机+ CentOS 7.3 + PostgreSQL 10.2 + pg_roaringbitmap 0.315超大基数bitmap的存取如果使用unnest(rb_to_array() 获取大结果集,不仅速度慢,而且受a

13、rray类型最大1GB的限制,在bit位超过7000万时发生错误。postgres=# select count(*) from unnest(rb_to_array(rb_fill(1,10,100,1,70000000); ERROR: invalid memory alloc request size 107374182416基于Roaringbitmap二进制格式的存取采用基于Roaringbitmap二进制格式的传输,不仅降低资源消耗,性能也有几十倍 以上的提升。示例如下:create table testtb(id int, bitmap roaringbitmap);String

14、 sql = select bitmap:bytea from testtb where id = ?; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setInt(1, 1);ResultSet rs = stmt.executeQuery(); while(rs.next()RoaringBitmap rb = new RoaringBitmap();DataInputStream is = new DataInputStream(rs.getBinaryStream(1); rb.deserialize(is);is.

15、close();rs.close();stmt.close();表定义:读取bitmap数据:17String sql = INSERT INTO testtb(id, bitmap) VALUES (?,?:bytea:roaringbitmap); PreparedStatement stmt = conn.prepareStatement(sql);RoaringBitmap rb = RoaringBitmap.bitmapOf(); for(int i = 0; i Distributed Subplan 3_1- HashAggregate (cost=0.00.0.00 rows

16、=0 width=0) Group Key: remote_scan.brand_cd- Custom Scan (Citus Real-Time) (cost=0.00.0.00 rows=0 width=0) Task Count: 32Tasks Shown: One of 32- TaskNode: host=30 port=6432 dbname=app_db- GroupAggregate (cost=2 rows=3 width=96) Group Key: brand_cd- Sort (cost=6 rows=3 width=96) S

17、ort Key: brand_cd- Seq Scan on member_order_102033 member_order (cost=0.00.17.62 rows=3 width=96) Filter: (statis_date = 2019-05-20:date)Task Count: 1 Tasks Shown: All- TaskNode: host=30 port=6432 dbname=app_db- Limit (cost=7 rows=100 width=48)- Sort (cost=2 rows=1000 width=48)So

18、rt Key: (rb_andnot_cardinality(intermediate_result.bitmap_cur, intermediate_result.bitmap_sum) DESC- Function Scan on read_intermediate_result intermediate_result (cost=0.00.15.00 rows=1000 width=48)SQL:执行计划:WK上初次rb_or_agg聚合CN上最终rb_or_agg聚合Citus多CN架构(Citus MX)24AppWorkerCoordinatorPostgreSQLmetadata

19、tb1PostgreSQLtb1_1WorkerPostgreSQLtb1_2PostgreSQLWorker(MX node)metadatatb1 tb1_1Worker(MX node)PostgreSQLmetadatatb1tb1_2仅支持DMLCoordinatorPostgreSQLmetadatatb1App普通Citus集群Citus MX集群支持DDL&DML优化:把最终聚合分散到所有WK上252. 创建中间表set citus.shard_count =8; -建议中间表分片数设置为等于worker数create unlogged table tb_dispatch( b

20、rand_cd text, - 其 他 维 度 ( 略 ) bitmap_cur roaringbitmap, bitmap_sum roaringbitmap);elect create_distributed_table(tb_dispatch,brand_cd,colocate_with=none);1. 配置Citus多CN架构在CN节点的postgresql.conf中添加下面的参数citus.replication_model=streaming从CN复制元数据到所有worker节点SELECT start_metadata_sync_to_node($cituswk1_ip, $

21、cituswk1_port); SELECT start_metadata_sync_to_node($cituswk2_ip, $cituswk2_port); SELECT start_metadata_sync_to_node($cituswk3_ip, $cituswk3_port);选择其中一个分组维度作为分片字段3. 初次聚合并将结果写入到中间表(在所有分片上并发执行)with tmp as (SELECT brand_cd,rb_and_cardinality(rb_or_agg(bitmap_cur), rb_or_agg(bitmap_sum) ) AS oldusercount,-老买家数rb_andnot_cardinality(rb_or_agg(bitmap_cur), rb_or_agg(bitmap_sum) ) AS newusercount -新买家数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论