Doris

基本概念

Doris 是基于 MPP 架构的交互式 SQL 数据仓库,主要用于解决近实时的报表和多维分析。

Doris 分成两部分 FE 和 BE ,FE 负责存储以及维护集群元数据、接收、解析、查询、设计规划整体查询流程,BE 负责数据存储和具体的实施过程。

在 Doris 的存储引擎中,用户数据被水平划分为若干个数据分片(Tablet,也称作数据分桶)。每个 Tablet 包含若干数据行。多个 Tablet 在逻辑上归属于不同的分区 Partition。一个 Tablet 只属于一个 Partition。而一个 Partition 包含若干个 Tablet。Tablet 是数据移动、复制等操作的最小物理存储单元。

原理解析

SQL解析

SQL解析在这篇文章中指的是将一条 sql 语句经过一系列的解析最后生成一个完整的物理执行计划的过程。

这个过程包括以下四个步骤:词法分析,语法分析,生成逻辑计划,生成物理计划。

  1. 词法分析:将字符串形式的 sql 识别成一个个 token,为语法分析做准备。

  2. 语法分析:语法分析主要负责根据语法规则,将词法分析生成的 token 转成抽象语法树(Abstract Syntax Tree)。

  1. 逻辑计划:逻辑计划负责将抽象语法树转换为代数关系。代数关系是一棵算子树,每个节点代表一种对数据的计算方式,整棵树代表了数据的计算方式和流动方向。

  1. 物理计划:物理计划是在逻辑计划的基础上,根据机器的分布,数据的分布,决定去哪些机器上执行哪些计算操作。Doris 系统的 SQL 解析也是采用这些步骤,只不过根据 Doris 系统结构的特点和数据的存储方式,进行了细化和优化,最大化发挥机器的计算能力。

设计目标

Doris SQL解析架构的设计有以下目标:

  1. 最大化计算的并行性

  2. 最小化数据的网络传输

  3. 最大化减少需要扫描的数据

总体架构

Doris SQL解析具体包括了五个步骤:词法分析,语法分析,生成单机逻辑计划,生成分布式逻辑计划,生成物理执行计划。

具体代码实现上包含以下五个步骤:Parse, Analyze, SinglePlan, DistributedPlan, Schedule。

Parse 阶段本文不详细讲,Analyze 负责对 AST 进行前期的一些处理,SinglePlan 根据 AST 进行优化生成单机查询计划,DistributedPlan 将单机的查询计划拆成分布式的查询计划,Schedule 阶段负责决定查询计划下发到哪些机器上执行。

注:AST 抽象语法树 Abstract Syntax Tree

由于SQL类型有很多,本文侧重介绍查询 SQL 的解析。

下图展示了一个简单的查询 SQL 在 Doris 的解析实现。

Parse阶段

词法分析采用 jflex 技术,语法分析采用 java cup parser 技术,最后生成抽象语法树(Abstract Syntax Tree)AST,这些都是现有的、成熟的技术,在这里不进行详细介绍。

AST 是一种树状结构,代表着一条 SQL。不同类型的查询 select, insert, show, set, alter table, create table 等经过 Parse 阶段后生成不同的数据结构(SelectStmt, InsertStmt, ShowStmt, SetStmt, AlterStmt, AlterTableStmt, CreateTableStmt等),但他们都继承自 Statement,并根据自己的语法规则进行一些特定的处理。例如:对于 select 类型的 sql,Parse 之后生成了 SelectStmt 结构。

SelectStmt 结构包含了 SelectList,FromClause,WhereClause,GroupByClause,SortInfo等结构。这些结构又包含了更基础的一些数据结构,如 WhereClause 包含了 BetweenPredicate(between表达式),BinaryPredicate(二元表达式),CompoundPredicate(and-or组合表达式),InPredicate(in表达式)等。

AST 中所有结构都是由基本结构表达式 Expr 通过多种组合而成,如下图所示。

Analyze阶段

文档勘误

  1. 透明 -> 不透明

链接

  1. 一下 -> 以下

链接

Doris的更多相关文章

  1. doris 0.9.0版本docker镜像制作与使用

    1. 安装docker 详情请参见本人博客 2. 编译doris 详情请参见doris官网文档 3. 在编译好的doris output文件夹下编写两个Dockerfile 3.1  Dockerfi ...

  2. Doris与Hadoop yarn混合部署遇到的坑

    Doris默认端口 Yarn 默认端口: 如图,端口冲突,在混合部署的情况下,会出现2个问题: 1. Yarn ResourceManager启动不起来 解决办法:修改yarn.resourceman ...

  3. Doris FE负载均衡配置

    0 背景概述 Doris完全兼容了mysql协议,并且Doris FE本身通过多follower选举机制选举出master,可以保证fe本身的高可用性,也可以通过加入observer fe节点来提高f ...

  4. Apache Doris通过supervisor进行进程管理

    下面一段文字是摘自doris官方文档:注:在生产环境中,所有实例都应使用守护进程启动,以保证进程退出后,会被自动拉起,如 Supervisor.如需使用守护进程启动,需要修改各个 start_xx.s ...

  5. CentOS 上使用vscode 调试百度大数据分析框架Apache Doris BE

    A: 前期准备工作 1. 安装vscode,详细请参见vscode官网https://code.visualstudio.com/docs/setup/linux,摘要如下: sudo rpm --i ...

  6. [转]Apache Doris资料汇总

    参考资料 https://www.toutiao.com/i6709706901770207748/?tt_from=weixin&utm_campaign=client_share& ...

  7. doris: shell invoke .sql script for doris and passing values for parameters in sql script.

    1. background in most cases, we want to execute sql script  in doris  routinely. using azkaban, to l ...

  8. build doris 0.11.5 on centos 7/ubuntu

    doris has envolved many thirdparty components since v0.9. so the build progress has changed a lot si ...

  9. 本周六 Apache DolphinScheduler & Doris 将联合线上 Meetup

    活动背景 2020年,大数据成为国家基建的一个重要组成,大数据在越来越多的领域展现威力.随着大数据的应用场景越来越多,大家对数据的响应速度和数据加工工作流的方便程度也提出了更高的要求.在这种背景下,相 ...

  10. DORIS系统概述

    DORIS(Doppler Orbitography and Radio-positioning Integrated by Satellite)(多普勒轨道学与无线电定位集成卫星),它是由法国Cne ...

随机推荐

  1. django DRF理解

    django restframework(DRF) 最近的开发过程当中,发现restframework的功能很强大,所以尝试解读了一下源码,写篇博客分享给大家,有错误的地方还请各位多多指出 视图部分 ...

  2. Web服务器-正则表达式-正则其他(3.1.3)

    @ 目录 其他api说明 关于作者 其他api说明 pattern = re.compile(r'\d+') m = pattern.match('6e812738712aaadad13') m.gr ...

  3. Numpy的学习2-基础运算1

    import numpy as np a=np.array([10,20,30,40]) # array([10, 20, 30, 40]) b=np.arange(4) # array([0, 1, ...

  4. AWVS批量导入网站(刷漏洞入门)

    今天整了一天这个AWVS批量扫描脚本,主要是下了好几个版本的AWVS,都不稳定,一次次删除又一次次安装. 做这件事儿目的就是为了批量刷漏洞,不过弄好之后又不打算刷漏洞了,不太喜欢无脑刷漏洞,没什么意义 ...

  5. 【命令】man命令帮助文档详解

    前言:Linux命令分为内建命令和外部命令:内建命令是shell本身自带的,外部命令是是一个可执行程序 我们在使用命令帮助的时候需要钱哦区分命令是内建命令还是外部命令 一.查看一个命令是内建命令还是外 ...

  6. 函数进阶· 第3篇《常用内置函数filter()、map()、zip(),怎么用的呢?》

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 由于微信公众号推送改为了信息流的形式,防止走丢,请给加个星标 ,你就可以第一时间接收到本公众号的推送! ...

  7. Proguard结合maven使用

    添加插件配置 项目是maven项目,则可以在 pom 的 build 标签下添加插件 <plugin> <groupId>com.github.wvengen</grou ...

  8. 通过`RestTemplate`上传文件(InputStreamResource详解)

    通过RestTemplate上传文件 1.上传文件File 碰到一个需求,在代码中通过HTTP方式做一个验证的请求,请求的参数包含了文件类型.想想其实很简单,直接使用定义好的MultiValueMap ...

  9. Android驱动入门-在Android系统上运行JAVA程序

    在linux上运行java程序,直接用javac编译,再用java运行就行了.但是在Android上,由于虚拟机和pc端的不同,所以操作方法也是不一样的. 如果想在Android上运行Hello wo ...

  10. 浅谈ES6数组及对象的解构

    一.数组的解构,ES6的新特性,主要是方便操作数组,节省不必要的代码,提高代码质量. 上图例子中, example1: 之前想要获取数组中的值,只能挨个获取下标,然后取值 example2:ES6新特 ...