1.2.3 功能丰富
Doris提供了非常丰富的功能来应对不同的业务场景。下面重点介绍一些Doris特色功能。
首先是分区分桶裁剪功能。Doris支持两个层次的数据划分:第一层是分区(Partition),支持Range和List的划分方式;第二层是分桶(Bucket),将数据通过Hash值进行水平划分,数据分片(Tablet)在集群中被均匀打散。Doris数据分布示例如图1-8所示。
图1-8 Doris数据分布示例
利用分桶裁剪功能,Doris可以将查询固定到极少数分片上,从而有效降低单个查询对系统资源的消耗,提升集群整体的并发查询能力。在高并发查询场景中,Doris单节点可以支持每秒上千的查询请求。
其次是合理的缓存功能。Doris支持SQL级别和Partition级别的查询缓存,如图1-9所示。其中,SQL级别的缓存以SQL语句的Hash值为Key,直接缓存SQL查询结果,非常适合更新频率不高,但是查询非常频繁的场景。而Partition级别的缓存会智能地将SQL查询结果中不同分区的数据进行存储,之后的查询中可以利用已缓存分区的数据及新分区实时查询数据得到最终结果,从而降低重复数据查询,减少对系统资源的消耗。
图1-9 高并发查询的数据缓存示意图
再次是支持Bitmap数据类型,利用位图来存储整型数据,并且可以通过位图进行一些集合类操作。Bitmap可以应用于高基数精确去重场景。传统的实时计算去重算法需要在内存中构建Hash表,在基数非常高的情况下会占用大量内存。而使用Bitmap可以将数值类型转换成位图上的0和1,从而极大地降低内存开销,并且对于去重,只需要将多个位图求交集后计算1的个数,从而在有限的内存下快速进行高基数精确去重计算。在用户画像场景中,通过位图的集合运算,我们可以快速获取不同标签组合的人群包。同时,Doris内置了很多Bitmap相关的函数,以计算留存率等,比如通过intersect_count()函数可以方便地计算用户的留存率。
最后是物化视图。物化视图也是Doris的核心特点之一。物化视图是将预先计算(根据定义好的SELECT语句)好的数据集存储在一个对用户透明且有真实数据的视图表格中。物化视图主要是为了满足用户对原始明细数据任意维度分析,快速对固定维度进行分析、查询,在统一视角下对明细、聚合数据进行分析的需求。在Doris中,用户可以使用明细数据模型存储明细数据,之后在明细数据上,选择任意维度和指标创建聚合物化视图,如SUM、MIN、MAX、COUNT等。Doris会保证明细表和物化视图中的数据完全一致。如果导入或删除物理表中的数据,Doris会自动更新,保证原始表和物化视图中的数据一致。同时,物化视图对用户是透明的。Doris会自动根据查询语句,匹配到最合适的物化视图进行查询。通过物化视图功能,Doris支持在一张表中统一明细数据模型和聚合模型,以加速某些固定模式的查询。
Doris还支持基于主键的数据更新。通过Unique模型,用户可以对数据基于主键进行更新。在实现层面,Doris采用Merge-on-Read方式提供更新后的数据。此外,用户还可以使用REPLACE_IF_NOT_NULL聚合方式,实现部分列更新。基于Unique模型,Doris还支持通过Marked Delete和Sequence Column等功能,实现对上游交易数据库数据同步更新,并且保证事务的原子性以及数据同步的顺序性。