首页 > 数据库 > 数据库开发技术 > Doris 的异步物化视图,可还行?
去年的时候,就测试过 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 之后的版本来说,异步物化视图的推出,算是进一步强化了它的一个实用性功能。
这次体验,只能算是简单尝了个鲜,至于这个功能到底好不好用,能不能持续稳定运行下去,还需要交给时间来检验。

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