一、项目背景
用户画像离线标签数据存储在es内,实时画像标签数据存储在redis内,离线用于圈选,实时用于点查。随着业务的增长,目前需要离线标签数据和实时标签数据同时进行圈选用户,上述架构无法满足,故需要一个离线数据和实时数据共存在一张表中提供圈选和点查能力。
通过调研压测不同的产品,最后选择了doris2.1版本升级画像架构。
二、doris表设计
1.宽表结构如下:
CREATE TABLE `user_data` (
`login_id` bigint(20) NULL COMMENT '登录ID',
`driver_id` bigint(20) NULL COMMENT '用户ID',
`d_s_people_0018` int(11) NULL COMMENT '用户归属城市',
`d_s_people_0031` string NULL COMMENT '用户描述',
INDEX idx_d_d_s_people_0018 (`d_s_people_0018`) USING INVERTED COMMENT '',
--倒排索引 建立不分词的倒排索引
INDEX idx_d_s_people_0031 (`d_s_people_0031`) USING INVERTED PROPERTIES("parser" = "unicode") COMMENT '',
--倒排索引 建立分词的倒排索引
) ENGINE=OLAP
UNIQUE KEY(`login_id`)
COMMENT 'OLAP'
DISTRIBUTED BY HASH(`login_id`) BUCKETS 6
PROPERTIES (
"replication_allocation" = "tag.location.default: 3",
"enable_unique_key_merge_on_write" = "true" ,
"store_row_column" = "true",
"row_store_page_size" = "16384",
"group_commit_interval_ms" = "10000",
"group_commit_data_bytes" = "134217728"
);
2. 表结构参数设置解析
- 打开写时合并,提高查询效率
--打开写时合并,提高查询效率
"enable_unique_key_merge_on_write" = "true"
doris官网:数据更新概述 - Apache Doris
- 打开行列共存模式,满足高并发点查
--打开行列共存模式,满足高并发点查
"store_row_column" = "true"
doris官网:高并发点查 - Apache Doris
- 行存 page_size:默认为 16KB
page 是存储读写的最小单元,page_size 是行存 page 的大小,也就是说读一行也需要产生一个 page 的 IO。这个值越大压缩效果越好存储空间占用越低,但是点查时 IO 开销越大性能越低(因为一次 IO 至少读一个 page),反过来值越小存储空间约高,点查性能越好。默认值 16KB 是大多数情况下比较均衡的选择,如果更偏向查询性能可以配置较小的值比如 4KB 甚至更低,如果更偏向存储空间可以配置较大的值比如 64KB 甚至更高。
--行存 page_size:默认为 16KB。
"row_store_page_size" = "16384"
doris官网:行列混存 - Apache Doris
- 自动提交条件
目前实时标签通过flink写入,离线标签数据分为了日调度,30分钟调度,10分钟调度写入doris表内 :
默认时间间隔为10s:"group_commit_interval_ms" = "10000"
默认提交数据量为 64 MB:"group_commit_data_bytes" = "134217728"
doris官网:Group Commit - Apache Doris
3.优缺点
a.倒排索引的使用
目前仅对比较复杂的文字描述才添加倒排索引。
因倒排索引原理,不建议对全部字段加倒排索引,全部字段增加倒排索引不仅不会提速,反而查询和写入都会变慢。
b.优点
离线数据及实时数据共存,可以支持更丰富业务需求
每个用户一行数据,不会因为增加新指标引起数据行数增加
c.缺点
新增标签需要增加新列
数据写入采用放的是写入合并策略,写入的性能会有所降低,根据测试完全能满足需求