Doris核心功能介绍—预聚合引擎和物化视图

Apache Doris是一个现代化的MPP分析型数据库产品。仅需亚秒级响应时间即可获得查询结果,有效地支持实时数据分析。Apache Doris的分布式架构非常简洁,易于运维,并且可以支持10PB以上的超大数据集。

展开查看详情

1.Doris核⼼心功能介绍—数据模型和物化视图 缪翎 2020年年7⽉月24⽇日

2.⽬目录 • Doris简介 • 数据模型 • 聚合模型,Rollup • 明细模型 • 物化视图

3.Doris • MPP分析型数据库产品 • PB级别,结构化数据,亚秒级 • 标准 SQL 语⾔言,兼容 MySQL 协议 • 易易伸缩,易易运维 • 多种数据分析需求 • 固定历史报表 • 实时数据分析 • 交互式数据分析 • ….

4.Doris

5.⽬目录 • Doris简介 • 数据模型 • 聚合模型,Rollup • 明细模型 • 物化视图

6.Data model-聚合模型 •表 • Key, Value, Aggregation function • sum, min, max, bitmap_union, hll_union, replace, replace_if_not_null Field Type Key Extra Time Date true AdvertiserId Int true Conutry Varchar true Clicks Int false sum Cost Int false sum • 导⼊入 Table A structure • Compaction • 查询

7.Data model-聚合模型 •表 • 导⼊入 Time AdvertiserId Country Clicks Cost Time AdvertiserId Country Clicks Cost 2019/12/31 1 US 5 16 2019/12/31 1 US 5+5=10 16+16=32 Agg 2019/12/31 1 US 5 16 2020/01/01 2 UK 10+30=40 10+10=20 2020/01/01 2 UK 10 10 2020/01/01 2 US 10+40+100=150 20+10+50=80 2020/01/01 2 UK 30 10 Version 0 of Table A 2020/01/01 2 US 10 20 2020/01/01 2 US 40 10 2020/01/01 2 US 100 50 原始数据 • Compaction • 查询

8.Data model-聚合模型 Time AdvertiserId Country Clicks Cost 2019/12/31 1 US 10 32 •表 2020/01/01 2020/01/01 2 2 UK US 40 150 20 80 • 导⼊入 Version 0 of Table A • Compaction Time AdvertiserId Country Clicks Cost • MVCC 2020/01/01 1 US 5 3 2020/01/01 2 UK 60 30 • Base + Cumulatives 2020/01/01 2 US 50 20 Version 1 of Table A = Time AdvertiserId Country Clicks Cost 7 8 2019/12/31 1 US 10 32 2020/01/01 1 US +5 +3 2020/01/01 2 UK 40+60 20+30 2020/01/01 2 US 150+50 80+20 • 查询 Version 0~1 of Table A

9. Field Type Key Extra Data model-聚合模型 OrderId State Int Varchar true false replace Amount Bigint false replace •表 Table order structure • 导⼊入 Query:查询每个订单的状态 SELECT OrderId,State FROM Order; • Compaction • 查询 OrderId State • 多版本聚合 1 2 Finished Retired replace OrderId State OrderId State OrderId State 1 Paid 1 Received 1 Finished 2 Paid 2 Received 2 Retired Version 0~30 of Table order Version 31~35 of Table order Version 36 of Table order

10.⽬目录 • Doris简介 • 数据模型 • 聚合模型,Rollup • 明细模型 • 物化视图

11.Rollup • 定义 • 预聚合 • 作⽤用 • 加快查询 • 应⽤用 • 百度统计:站点流量量数据,⽤用户⾏行行为⽇日志 • 天,⽉月,年年表 • 维度 • 空间 vs 时间

12.Rollup AdvertiserI Click Click Time Time AdvertiserId Country Country Cost Cost d ss 2019/12/31 2019/12/31 11 US US 10+1 10 32+10 32 2020/01/01 2020/01/01 11 US US 30 30 40 40 2020/01/01 2020/01/01 22 UK UK 40 40 20 20 • 创建 Table Table AA • 部分维度 AdvertiserId Country Country Clicks Clicks Cost Cost • 导⼊入 Time AdvertiserId Country Clicks Cost 11 US 40+1 10+30 72+10 32+40 22 US 150 150 80 80 • 同步 2019/12/31 1 US 1 10 Rollup Rollup BB • 增量量更更新 Load Query:每条⼴广告在不不同国家的点击量量 • 查询 SELECT AdvertiserId,Country, sum(Clicks) FROM A • ⾃自动选择 GROUP BY AdvertiserId, Country;

13.⽬目录 • Doris简介 • 数据模型 • 聚合模型,Rollup • 明细模型 • 物化视图

14.Data model-明细模型 • 聚合模型 • 优势:预聚合,分析型查询快 Time AdvertiserId Country UserId Cost • 劣势: 2019/12/31 1 US 1 32 • 明细信息 2020/01/01 2 UK 2 20 2020/01/01 2 US 1 80 • ⽆无聚合需求 Table B • 初期维度指标不不明确 • 明细模型 • ⽤用户⾏行行为明细 • 优势:明细信息可保留留 • 劣势:固定维度分析型查询

15.⽬目录 • Doris简介 • 数据模型 • 聚合模型,Rollup • 明细模型 • 物化视图

16. 物化视图 “ In computing, a materialized view is a database object that contains the results of a query. For example, it may be a local copy of data located remotely, or may be a subset of the rows and/or columns of a table or join result, or may be a summary using an aggregate function. ” From Wikipedia • Doris 的物化视图 • 适⽤用场景 • 明细 + 分析并存 • 查询包含很重的处理理逻辑:Agg • 查询结果只涉及到表中很⼩小⼀一部分列列或⾏行行 • 优势 • 查询性能⼤大幅提升 • ⾃自动更更新 • 查询⾃自动选择

17.物化视图—创建 CREATE TABLE sales_records ( record_id INT, • Base 表 seller_id INT, sale_date DATE, sale_amt BIGINT ) DISTRIBUTED BY HASH (record_id) BUCKETS 10; • 物化视图表 CREATE MATERIALIZED VIEW seller_amt AS SELECT seller_id, sale_date, sum(sale_amt) FROM sales_records GROUP BY seller_id, sale_date; • 后台作业执⾏行行 • 存量量 • 增量量 • 数据⼀一致性

18. 候选集 物化视图—查询 Field record_id Type INT Key true Extra seller_id INT true sales_records • ⾃自动匹配 store_id sale_date INT DATE true false sale_amt BIGINT false Field Type Key Extra seller_id INT true SELECT seller_id, sum(sale_amt) mv_1 匹配物化视图 sale_date DATE true FROM sales_records sale_amt BIGINT false sum WHERE sale_date = ‘2020-07-19’ GROUP BY seller_id; Field Type Key Extra store_id INT true mv_2 sale_date DATE true sale_amt BIGINT false sum Field Type Key Extra seller_id INT true mv_3 sale_amt BIGINT false sum

19. 物化视图—⾃自动匹配 1.选择最优 2.查询改写 候选集 SELECT seller_id, sum(sale_amt) FROM sales_records WHERE sale_date = ‘2020-07-19’ Field Type Key Extra GROUP BY seller_id; record_id INT true 最优 … … mv_1 Field Type Key Extra Field Type Key Extra seller_id INT true seller_id INT true … … … … … … … … SELECT seller_id, sum(sale_amt) FROM mv_1 Field Type Key Extra WHERE sale_date = ‘2020-07-19’ sale_date DATE true GROUP BY seller_id; … … … … Field Type Key Extra seller_id INT true sale_amt BIGINT false sum

20.物化视图—选择最优 [sales_records, mv_1, mv_2, mv_3] 1. 过滤候选集 2. 选择最优 SELECT seller_id, sum(sale_amt) FROM sales_records filter WHERE sale_date = ‘2020-07-19’ GROUP BY seller_id; [sales_records, mv_1] 前缀索引 pick 聚合程度 mv_1

21. SELECT seller_id, sum(sale_amt) FROM sales_records WHERE sale_date = ‘2020-07-19’ 物化视图—选择最优 GROUP BY seller_id; [sales_records, mv_1, mv_2, mv_3] 1. 过滤候选集 WHERE sale_date = ‘2020-07-19’ Where Field Type Key Extra record_id INT true seller_id INT true sales_records [sales_records, mv_1, mv_2] store_id INT true GROUP BY seller_id; sale_date DATE false Group by sale_amt BIGINT false Field Type Key Extra seller_id INT true [sales_records, mv_1] sale_date DATE true mv_1 sum(sale_amt) sale_amt BIGINT false sum Agg function Field Type Key Extra store_id INT true mv_2 sale_date DATE true [sales_records, mv_1] sale_amt BIGINT false sum SELECT seller_id, sum(sale_amt) Field Type Key Extra output seller_id INT true mv_3 sale_amt BIGINT false sum [sales_records, mv_1]

22.物化视图—选择最优 SELECT seller_id, sum(sale_amt) FROM sales_records WHERE sale_date = ‘2020-07-19’ GROUP BY seller_id; 1. 过滤候选集 [sales_records, mv_1] 2. 选择最优 Rule1: 前缀索引 Field Type Key Extra record_id INT true WHERE sale_date = ‘2020-07-19’ seller_id INT true sales_records store_id INT true Rule2: 聚合程度 sale_date DATE false sale_amt BIGINT false Field Type Key Extra seller_id INT true mv_1 sale_date DATE true sale_amt BIGINT false sum

23.物化视图—⾃自动匹配 1. 选择最优:mv_1 2. 查询改写 SELECT seller_id, sum(sale_amt) FROM sales_records WHERE sale_date = ‘2020-07-19’ GROUP BY seller_id; seller_id sale_date sum(sale_amt) SELECT seller_id, sum(sale_amt) 1 2020-07-18 100 FROM mv_1 1 2020-07-19 100 WHERE sale_date = ‘2020-07-19’ mv_1 2 2020-07-19 1000 GROUP BY seller_id; 2 2020-07-20 100 3 2020-07-19 50

24. advertiser_view_record 物化视图—查询改写 Time 2019/12/31 Advertiser Doris Channel web User_id 100 2019/12/31 Doris web 100 2020/01/01 DolphinScheduler web 100 • Count(distinct) - > bitmap_union_count 2020/01/01 Doris app 100 2020/01/01 Doris web 100 2020/01/01 Doris app 200 Query:查询⼴广告在web端的uv SELECT advertiser, count(distinct user_id) Advertiser channel Bitmap_union_user_id FROM advertiser_view_record 最优 mv Doris web [100] WHERE channel = ‘web’ Doris app [100,200] GROUP BY advertiser; DolphinScheduler web [100] 查询改写 Query:查询⼴广告在web端的uv Advertiser Bitmap_union_count(user_id) SELECT advertiser, bitmap_union_count(user_id) Doris 1 FROM mv DolphinScheduler 1 WHERE channel = ‘web’ GROUP BY advertiser;

25.物化视图 • 聚合函数 • SUM, MIN, MAX (Version 0.12) • COUNT (Version 0.13) • HLL_UNION => NDV • BITMAP_UNION => COUNT(DISTINCT) • 限制 • DML:delete Time Advertiser Bitmap_union_user_id Query:删除渠道为app端的数据 2019/12/31 Doris [100] DELETE FROM advertiser_view_record 2020/01/01 DolphinScheduler [100] WHERE channel = ‘app’; 2020/01/01 Doris [100,200] 物化视图 mv_2 key(Time, Advertiser)

26.物化视图 • 后续计划 • ⽀支持函数变化:⽉月表 to_mouth, 年年表 to_year • ⽀支持指定分区 • ⽀支持join • …

27.适⽤用场景 • 聚合模型 VS 明细模型 • 固定维度分析类查询 – 聚合模型 • 报表 • 明细数据查询 – 明细模型 • 交易易明细 • Materialized view VS Rollup • 共同点:预聚合 • 超集 • 明细 + 分析:物化视图

28.联系我们 • https://github.com/apache/incubator-doris • https://doris.apache.org/master/zh-CN/

Apache DolphinScheduler(原EasyScheduler)是一个分布式工作流任务调度系统,主要解决错综复杂的依赖关系,而不能直观监控任务健康状态等问题。同类作品有oozie、Azkaban等,欢迎对比,哈哈