ITPub博客

首页 > 数据库 > 数据库开发技术 > Doris 的异步物化视图,可还行?

Doris 的异步物化视图,可还行?

原创 数据库开发技术 作者:安瑞哥是码农 时间:2024-06-14 20:20:04 0 删除 编辑


去年的时候,就测试过 Doris 的物化视图功能,当时还是 1.x 的版本,而且那个时候,还没有区分「同步物化视图」跟「异步物化视图」两个概念,就叫物化视图(同步物化视图)。


还记得当时我是跟 Clickhouse(下称CK) 的物化视图做的功能对比,如果把 CK 的物化视图能力比做是一个大学生的话,那么当时 Doris 的物化视图水平,就还处在九年义务教育阶段。


当时 Doris 提供的物化视图能力(还有rollup)在我看来,顶多算是一种应对多样查询的加速手段。


而现在推出的这个「异步物化视图」,倒是有了几分真正物化视图该有的模样,那么这篇文章,咱们就一起来看看,这个新推出的物化视图,耍起来到底怎么样?



0. 基本概念


异步物化视图是 Doris 在 2.1 之后新增的功能(Emm... 又解锁一个新鲜玩意),从官方文档的介绍来看,它具备的能力,跟之前测试过的 CK 物化视图就很比较类似了(还是有差别)。


如果说 Doris 之前的「同步」物化视图(普通物化视图),只是依附于基础表之上的,一种为了加速多样化查询时(比如普通的聚合汇总),类似于一种特殊的索引功能。


那么这个新的「异步」物化视图,就是一张脱离于基础表之外的,基于对基础表进行数据提取后的,一张全新的「物理表」。


从文档介绍上来看,这个基于基础表之上的数据提取逻辑,涵盖了 JOIN、Group by、union all 等比较复杂的功能,跟之前 1.x 的功能相比,可谓是鸟枪换炮了(还记得之前物化视图的数据提取逻辑,连一个简单的时间转换函数都不支持)。



1. 一个小问题


要不说是新功能呢,还没来得及开始体验呢,就给绊了一跤。


根据官方文档的描述,我照猫画虎,写了个最简单的异步物化视图创建方式,结果:



我估计很多人跟我一样,看到这个异常,首先第一反应就是:尼玛是不是 SQL 哪个地方写错了。但转念一想:不应该啊,我可是从文档原封不动复制过来的呢,而且当前的集群版本也是正儿八经的 2.1.x。


其实这种一下子让人摸不着头脑的报错,对于 Doris 来说,还真不是个案,希望这点能引起社区的重视,以后类似的异常能提示的更明显些。


一时间确实没有头绪,最后只能去问官方的人,告诉我是因为有个开关没打开:



好吧,打开后,这个报错就没有了(其实这个开关是默认打开的,但由于我是从1.x 升级过来的,所以才出现的这种情况)。



2. 跑起来


虽然是「异步」,但是 Doris 在让你创建它的时候,可以自行选择异步的时间间隔、同步方式、同步频率等参数。


 



反观 CK,就没有这些设置。


接下来,我分别用了几个不同的逻辑方式,从简单到复杂,创建了下面几个异步物化视图:


第1个:最简单的 select 逻辑


CREATE MATERIALIZED VIEW mv02 BUILD IMMEDIATE REFRESH COMPLETE ON SCHEDULE EVERY 1 MINUTE
        DISTRIBUTED BY RANDOM BUCKETS 3
        PROPERTIES ('replication_num' = '1') 
        AS 
        select client_ip, target_ip from example_db.dns_logs_from_kafka;


第2个:用 union all 逻辑


CREATE MATERIALIZED VIEW mv03 BUILD IMMEDIATE REFRESH COMPLETE ON SCHEDULE EVERY 1 MINUTE
        DISTRIBUTED BY RANDOM BUCKETS 3
        PROPERTIES ('replication_num' = '1') 
        AS
        select client_ip,target_ip,count(*) as count from example_db.dns_logs_from_kafka group by client_ip,target_ip
        union all
        select client_ip,null,count(*) as count from example_db.dns_logs_from_kafka group by client_ip


第3个:用 inner join 逻辑


CREATE MATERIALIZED VIEW mv04 BUILD IMMEDIATE REFRESH COMPLETE ON SCHEDULE EVERY 1 MINUTE
        DISTRIBUTED BY RANDOM BUCKETS 3
        PROPERTIES ('replication_num' = '1') 
        AS
        select a.client_ip,b.target_ip from dns_logs_from_kafka a inner join dns_logs_from_spark01 b on a.domain = b.domain


第4个:用 inner join + group by 逻辑


CREATE MATERIALIZED VIEW mv05 BUILD IMMEDIATE REFRESH COMPLETE ON SCHEDULE EVERY 1 MINUTE
        DISTRIBUTED BY RANDOM BUCKETS 3
        PROPERTIES ('replication_num' = '1') 
        AS
        select a.client_ip,b.target_ip,count(*) as count from dns_logs_from_kafka a inner join dns_logs_from_spark01 b on a.domain = b.domain group by a.client_ip,b.target_ip


第5个:用函数 + group by 逻辑


CREATE MATERIALIZED VIEW mv06 BUILD IMMEDIATE REFRESH COMPLETE ON SCHEDULE EVERY 1 MINUTE
        DISTRIBUTED BY RANDOM BUCKETS 3
        PROPERTIES ('replication_num' = '1') 
        AS
        select client_ip,lower(domain) as domain,count(*) as count from dns_logs_from_kafka group by client_ip,lower(domain)


以上5种方式,都可以很顺利地把异步物化视图创建成功。


根据目前的这个设置,基础表里面的历史数据,都能很快写入到各自的物化视图表里。




对增量数据的支持:


既然是物化视图,那么我们自然也希望对基础表后续的数据变化(比如新增),也能同步到目标物化视图里。


通过我的测试,目前 Doris 的异步物化视图,是可以做到这一点的(同步时间间隔,跟你创建视图时的频率设置有关),包括普通的新增,以及聚合结果的新增。



3. 说说优点


通过这次对 Doris 异步物化视图功能的体验,明显比之前的要好太多(同步物化视图),功能也更加实用。


比如支持上面测试过的 union all、join、group by 和函数等实用功能。


而且,在同步基础表历史数据的易用性这方面,个人感觉做得比 CK 要好,CK 的物化视图默认情况下,只能同步新增数据,想要同步历史的全量数据,玩法比较复杂。



4. 再说说局限性


相比 CK,Doris 的异步物化视图虽然本质上也是生成了一张额外的物理表,但是,这个物理表,你是没有办法提前创建的(CK 可以)。


也就是说,Doris 的异步物化视图这张表,里面的字段类型,表类型,字段的索引方式等,你没有办法自己来决定(CK 可以),只能在执行创建视图语句时,Doris 内部决定。


这一点,从查看创建的视图语句就可以看出来(show create table mv06):



它的引擎是内部确定的,对比 CK 可以自由选择引擎的方式,有局限性。



最后


对于 Doris 2.1 之后的版本来说,异步物化视图的推出,算是进一步强化了它的一个实用性功能。


这次体验,只能算是简单尝了个鲜,至于这个功能到底好不好用,能不能持续稳定运行下去,还需要交给时间来检验。




你可以添加我的私人微信,拉你入技术讨论群,跟一群热爱技术的小伙伴一起成长...


原文作者:安瑞哥是码农;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2022-02-16

  • 博文量
    228
  • 访问量
    115415