当前位置: 首页 > article >正文

Starrocks 物化视图的实现以及在刷新期间能否读数据

背景

本司在用Starrocks做一些业务上的分析的时候,用到了物化视图,并且在高QPS的情况下,RT也没有很大的波动,所以在此研究一下Starrock的实现,以及在刷新的时候是不是原子性的
本文基于Starrocks 3.3.5

结论

Starrocks的物化视图的更新是通过Insert Overwrite的方式实现的,在执行该SQL期间,会新建临时分区并进行替换,最后在替换分区的时候,会进行表加锁操作,所以说物化视图不存在读不到数据的情况。

分析

这里我们只关心主流程,其他的细节直接跳过

物化视图的创建

直接到 Starrocks.g4

createMaterializedViewStatement

这里会用 AstBuilder.visitCreateMaterializedViewStatement 生成 CreateMaterializedViewStatementMaterializedViewAnalyzer.visitCreateMaterializedViewStatement 方法进行物化视图的解析,主要是解析里面的SQL,并生成物理计划,
之后再走到StmtExecutor.handleDdlStmt 方法:

    private void handleDdlStmt() throws DdlException {try {ShowResultSet resultSet = DDLStmtExecutor.execute(parsedStmt, context);if (resultSet == null) {context.getState().setOk();} else {

最后会走到LoaclMetaStore.createMaterializedView方法:

 @Overridepublic void createMaterializedView(CreateMaterializedViewStatement stmt)throws DdlException {// check mv exists,name must be different from view/mv/table which exists in metadataString mvName = stmt.getTableName().getTbl();String dbName = stmt.getTableName().getDb();。。。createTaskForMaterializedView(dbName, materializedView, optHints);

这个createTaskForMaterializedView方法

  • 有个Task task = TaskBuilder.buildMvTask(materializedView, dbName);方法:
 public static Task buildMvTask(MaterializedView materializedView, String dbName) {Task task = new Task(getMvTaskName(materializedView.getId()));...task.setDefinition(materializedView.getTaskDefinition());task.setPostRun(getAnalyzeMVStmt(materializedView.getName()));task.setExpireTime(0L);if (ConnectContext.get() != null) {task.setCreateUser(ConnectContext.get().getCurrentUserIdentity().getUser());task.setUserIdentity(ConnectContext.get().getCurrentUserIdentity());}handleSpecialTaskProperties(task);return task;}

其中 materializedView.getTaskDefinition 代码如下:

    public String getTaskDefinition() {return String.format("insert overwrite `%s` %s", getName(), getViewDefineSql());}

可以看到这里是insert overwrite的方式.

  • 与此同时,createTaskForMaterializedView还调用TaskManager.createTask方法用来周期性的调度任务

物化视图的执行

上面看到物化视图的执行是通过Insert overwrite的方式实现的,所以
直接找到Starrocks.g4:

insertStatement

通过AstBuilder.visitInsertStatement解析,解析为InsertStmt,最后会转到StmtExecutor.handleDMLStmtWithProfile:

handleDMLStmt||\/
handleInsertOverwrite||\/
InsertOverwriteJobMgr.executeJob||\/
InsertOverwriteJobRunner.run()||\/
InsertOverwriteJobRunner.doLoad()

InsertOverwriteJobRunner.doLoad() 方法如下:

        Preconditions.checkState(job.getJobState() == InsertOverwriteJobState.OVERWRITE_RUNNING);createTempPartitions();prepareInsert();executeInsert();doCommit(false);transferTo(InsertOverwriteJobState.OVERWRITE_SUCCESS);
  • createTempPartitions(); 这个主要创建临时分区。
  • prepareInsert/executeInsert 这里主要是进行临时分区的数据写入
  • doCommit 这会进行分区的替换
         Locker locker = new Locker();if (!locker.lockDatabaseAndCheckExist(db, tableId, LockType.WRITE)) {throw new DmlException("insert overwrite commit failed because locking db:%s failed", dbId);}...targetTable.replacePartition(sourcePartitionNames.get(0), tmpPartitionNames.get(0));...} finally {locker.unLockDatabase(db, tableId, LockType.WRITE);}
    
    不同于之前的数据写入操作,这里会进行锁表的操作,也就是在这期间读写是有互斥的,并且这里面分区(非分区表其实也是有单个分区的存在)的替换都是内存操作,所以会很快。

所以从实现来说,insert overwrite在执行阶段是互斥的,并且只有在元数据操纵期间才会加锁,数据写入阶段是不会加锁的,所以速度是很快的。

http://www.lryc.cn/news/2392150.html

相关文章:

  • 前后端传输 Long 类型数据时(时间戳,雪花算法ID),精度丢失的根本原因
  • 探索容器技术:Docker与Kubernetes的实践指南
  • Ubuntu从0到1搭建监控平台:本地部署到公网访问实战教程Cpolar穿透与Docker部署全过程
  • vscode java debug terminal 中文乱码
  • 3D PDF如何制作?SOLIDWORKS MBD模板定制技巧
  • Qt DateTimeEdit(时间⽇期的微调框)
  • C# 类和继承(屏蔽基类的成员)
  • 基于qt5和stk10开发的互联调试
  • matlab雷达定位仿真
  • 基于vue框架的动物园饲养管理系统a7s60(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • MySQL 索引和事务
  • BERT分类器和朴素贝叶斯分类器比较
  • WPS自动换行
  • C#面向对象核心:类继承详解
  • maven中的grpc编译插件protobuf-maven-plugin详解
  • 服务发现Nacos
  • 社群分享:义乌|杭州电商|店群卖家,私域鱼塘运营的排单系统开源|私域鱼塘运营|返款软件开源
  • C#回调函数深度解析
  • 通义智文开源QwenLong-L1: 迈向长上下文大推理模型的强化学习
  • HTTP代理的实际用处有哪些?HTTP代理强在哪里?
  • 低代码——表单生成器以form-generator为例
  • 【Vue Vapor Mode :技术突破与性能优化的可能性】
  • Parasoft C++Test软件单元测试_常见问题及处理
  • vue渲染数组各子项实现文本超出宽度显示tooltip
  • libreoffice容器word转pdf
  • AI模型升级与机器人产业落地同步推进
  • 安全编码与AI接口权限控制
  • linux centos 服务器性能排查 vmstat、top等常用指令
  • MySQL----视图的创造和使用
  • c/c++的opencv伽马噪声