导语
Apache Doris 是一款基于现代 MPP 架构大规模分布式技术实现的 SQL 分析型数据库,能够在 PB 级数据量下提供近乎毫秒级的查询性能。
Apache Doris 从第一版到现在已有 14 年的不间断迭代开发,是开源社区少有的坚持到最终走向成熟的产品(光是 SQL 函数就有 200 多个),Doris 今年成功晋升成为 Apache 顶级项目。现在在 GitHub 社区拥有包括百度、阿里、腾讯、美团、京东、小米等公司的将近 400 个开发者,6000 多 Star,活跃度一度超过 Spark 和 Flink。
Doris 这些年也被创业者和资本市场看好,基于 Doris 的商业化公司也是一个接一个,如鼎石公司,其产品 StarRocks (是从 Doris 0.13 fork 出来后重新建立了新的社区) 一度成为分析性数据库的黑马; 还有飞轮,创立之初就获得3亿人民币的天使轮投资;其产品 SelectDB(内核完全基于 Apache Doris)最近荣登 ClickBench 榜单,性能号称全球第一。
正是因为 Apache Doris 如此优秀,所以我们基于 Apache Doris 在腾讯云上推出了腾讯云 Doris。
本文就结合腾讯云 Doris 的适用场景和核心技术来给大家分享一下如何基于云数据仓库 Doris 开启实时统一数据分析之路。
1. Doris 技术架构
我们接下来看下 Doris 的这个技术架构。
图1 Doris 技术架构图
Doris 的设计者中很多人都有过早期 Hadoop 痛苦的运维经历,Hadoop 虽然解决了很多大数据的问题,但是其安装、配置和运维的复杂性也让人们望而却步;鉴于此,他们想设计出一个安装部署和开发运维都极具简单的一个系统,但是功能上需要支持到 PB 级大数据规模。
为了不重复造轮子,Doris 是基于一个早期的 Impala 版本基础上进行改造的。
首先就是减少组件,减少到两个,前端 FE 和后端 BE。FE 和 BE 的职责分别如下:
图2 Doris FE 和 BE 的职责
其中 FE 是 JAVA 代码实现的,简化了 Impala 通过 BE 反过来 Jni 调用 FE 的逻辑,加入了 MySQL 服务端相关代码,并开发了全新的元数据系统。这样的改造让 FE 成为真正的前端,用户可以通过任意 MySQL 客户端直接连接 FE 就可以进行查询了。
BE 是 C++ 代码,其中只有执行引擎部分沿用了 Impala 代码,因为 Impala 没有分布式存储,那个时候也没有 Kudu(2015 年才有第一版),所以从头自研了分布式存储。这个是 Doris 最厉害的地方。
图3 Doris FE 元数据
这是 FE 元数据,元数据其实存储在内存,这里的核心是实现了一个 Paxos 协议的内存性的高可用架构,支持读写分离和故障转移。多个 FE 节点还可以支持高并发。
图4 Doris BE 多副本分片
这个 BE 分布式管理框架,可以自动的管理数据副本的分布、进行修复和均衡。比如对于副本损坏的情况,Doris会自动感知并进行修复。
另外,无论 FE 还是 BE 都能通过一条简单的 SQL 命令实现水平扩缩容。当然通过腾讯云管控的话,你就是去点一下鼠标, Doris 就会迅速扩缩容。
图5 Doris 水平扩展
另外就是减少依赖,Doris 的设计目标是完全不依赖第三方系统。为此,去掉了 Impala 中对 Hadoop 体系的支持的部分。
2. 适用场景及其背后的技术
Doris 作为一个分析性数据库,适合几乎所有的分析性数据的场景,其中最主要的四种场景列出如下:
图6 Doris 使用场景
这四种场景都是实际业务中大家对分析性数据库期望最多的场景,但是这些场景在大数据量下,对系统的要求也是非常高的。
那么 Doris 是通过什么样的技术来满足这些场景对系统功能和性能的苛刻要求呢。
2.1 场景一:OLAP 多维分析和报表——高维表上的高速随意探查能力
这里是一个商业化BI系统中一个多维分析报表的例子。
我们看到,用户可能会能够自助探索式的拖动这些列的标签来组装出一个报表,这里就会生成一个 SQL,然后查询背后的数据库。
像这种,使用者基于一个结果集通过各种操作来进行数据分析的场景就是 OLAP 多维分析,那这个结果集就是一个数据立方体(CUBE),
多维分析就是针对这个数据立方 进行钻取、上卷、切片、切块、旋转等操作。
图8 OLAP 概念
这个数据立方体的定义和操作,在关系型数据库中可以通过维度建模实现,维度建模最常见的模型就是星型模型,复杂一点的就是雪花模型。
维度建模中,一个表中的列可以分为维度列和指标列,Doris 就是严格按照这个思路做了实现,比如这个建表语句。这些列就是维度列,这些就是指标列。
图9 Doris 聚合数据模型
我们看到指标列上有一些函数,Doris 可以做到在数据导入的时候,数据按照维度列进行分类,再按照指标列指定的函数进行聚合。这种预聚合能力大大减少了查询所扫描的数据量,从而加速了聚合查询的速度。
另外,Doris 还实现了物化视图、Rollup 索引和 CUBE 的语法,其中的 Rollup 对应上卷操作、通过 Grouping Set 语法可以建出 CUBE 立方体来。
和大多数分析型数据库一样,Doris 也是以列存格式存储数据的。列存也是向量化的基础。
向量化是指计算从一次对一个值进行运算转换为一次对一组值进行运算的过程。为了实现向量化,在 Doris 中我们进行了两个大的方面的改造。
一方面从CPU方面,现代CPU都增加了一类指令,叫做 SIMD (Single Instruction Multiple Data) 即单条指令操作多条数据。
Doris 通过重写所有导入和查询的基础函数,也就是数据库中所说的算子,让编译器编译后尽可能多的生成 SIMD 指令来实现 CPU 的向量化。
图10 Doris 列存和向量化
另一方面从数据库的角度,我们知道 Doris 是火山模型,传统火山模型实际上是按行,一行一行处理的。为了实现向量化,Doris 被改造成了按多行一批,一批内按照列这种方式。
Doris 在进行向量化代码开发时,也是站在了巨人的肩膀上,在列存模型和函数框架上引用了部分 Clickhouse 19.16.2.2 版本的代码,我们在引用代码的 License 上注明了相应的工作,同时与 Clickhouse 社区进行了对应的沟通。
青出于蓝胜于蓝,由于向量化的加持,Doris 现在的性能已经超过了他的向量化课程的老师俄罗斯的 Clickhouse 先生。
2.2 场景二:实时数仓和数据分析——PB 级数据量上的实时增、删、改、查能力
下图展示的是一个 Doris 的建表语句,从这个语句中可以看出,数据可以分区(Partition),也可以分桶 (DISTRIBUTED BY),通过分区和分桶,Doris 可以将一个表 (Table) 的数据拆分成多个 Tablet。
图11 Doris 建表语句
Doris 中每个 Tablet 可以设置多个副本,这些 Tablet 及其副本可以存储在不同的 BE 中,从而保证数据的高可用和高可靠。
图12 Doris数据划分
物理上,Tablet 会按照一定大小(256M)拆分为多个 Segment 文件,Segment 是列存的 LSM-Tree 全称是Log Structured Merge Tree,是一种分层,有序,面向磁盘的数据结构
。这种结构的理论基础是磁盘批量的顺序写要远比随机写性能高。
图13 LSM Tree 写入
作为对实时数仓和数据分析的支持,数据的实时写入是非常关键的一个环节,为了实现数据的实时写入,Doris 开发了 Stream Load 实现了数据的实时写入能力。在此基础上,又提供了三种常用的实时导入功能:也即通过内置的 Canal 客户端实时获取 MySQL 的 binlog;通过 Doris Flink Connector 对接 Flink 的 CDC 能力实现数据的精确导入; 通过内置的 Kafka
客户端订阅 Kafka 的 Topic, 从而实现数据的实时更新。
图14 Doris Stream LOAD
2.3 场景三:高并发场景——高并发下低延迟查询能力
高并发情况对数仓来说是一个很大的挑战。
要想实现高并发,除了网络吞吐等需要做得比较顺畅以外,对于数仓来说,有一个关键就是你的查询性能需要非常好,也就是低延迟。
查询性能好,高并发就被快速返回,不会堆积。
另外,为了获得高性能,数据库需要尽量减少锁的使用,比如MVCC技术就能实现读写分离,写锁不影响读。
图15 Doris UNIQUE KEY
Doris的所有表都有主键,上面这个例子是一个unique key 模型,后面的列就是主键。
主键是有序的,基于主键的 unique key 模型上 Doris 也使用了类似 MVCC 的技术,实现了多个版本,也就是写入和更新都是插入一条新的数据,只是数据的版本会增加。
当然,这引来一个问题,就是读取的时候每个主键需要读多条数据。
为了加快读取最终的数据,需要在数据写入后异步进行 Compaction 合并。Doris 有两级合并,就是前面讲到的在 LSMtree 上进行的两种 Compaction 操作。
图16 Doris 主键
人们对高并发的一个常见诉求就是,比如现有系统不能满足的时候,能否通过加机器增加并发。但是很多系统并不能。
Doris 拥有一个现代的MPP查询引擎,这个引擎完整实现了 Exchange 节点。有了 Exchange 节点,查询就能被分解到各个节点进行并行数据处理。
同时 Doris 由于FE和BE能很容易横向扩展,理论上就能应对并发增加的情况,从而满足高并发场景。
图17 MPP 分布式查询引擎
Doris 提供了丰富的索引结构来帮助加速数据的读取和过滤。索引的类型大体可以分为智能索引和二级索引两种。其中智能索引是在 Doris 数据写入时自动生成的,无需用户干预。而二级索引是用户可以选择性的在某些列上添加的辅助索引。
图18 索引、动态分区裁剪和谓词下推技术
智能索引包括前缀稀疏索引和MinMax索引两种。
前缀稀疏索引是建立在排序结构上的一种索引。Doris 存储在文件中的数据,是按照排序列有序存储的,Doris 会在排序数据上,每 1024 行创建一个稀疏索引项。索引的 Key 即当前这1024行中,第一行的前缀排序列的值。当用户的查询条件包含这些排序列是,我们可以通过前缀稀疏索引快速的定位到起始行。
另外,Doris 也实现了动态分区裁剪和谓词下推技术,这些技术都能有效的降低最终从磁盘 scan 的数据量,从而加快查询的执行。
2.4 场景四:大数据和数据库统一分析——Hadoop 生态兼容和外表高性能查询能力
Doris 不依赖 Hadoop 组件,但是 Doris 本身对 Hadoop 生态进行了全面的支持。除了可以通过 Flink, Spark 写入 Doris ,我们还可以导入 HDFS 的数据,也可以通过建立 Hive 外表,直接查询 Hive 数据。
下面就是一个 Hive 外表的例子:
图19 Hive 外表
下面是一个从 HDFS 导入的例子。
图20 从 HDFS 导入
下图是我画的一个 Doris 对 Hadoop 生态支持的一个全景图。
图21 Doris 融入 Hadoop 生态
3. 开源 OLAP 数仓/引擎 如何选型
数据仓库是一种在商务智能 (BI) 系统中进行数据分析的数据管理系统。
而OLAP是分析和评估数仓数据的技术之一。
图22 数仓和 OLAP
Doris 作为一款开源 OLAP 数仓/引擎具有优异的性能、极简的架构并支持很多场景。
这里我们也总结下看看,开源 OLAP 数仓/引擎都有哪些,以及这些引擎之间是如何分类的,
图23 开源 OLAP 数仓/引擎
赞同 33添加评论
分享
收藏喜欢
收起
已认证账号
关注
3 人赞同了该回答
我来啦,先介绍一下我自己!
SelectDB 是一家开源技术公司,致力于为 Apache Doris 社区提供一个由全职工程师、产品经理和支持工程师组成的团队,繁荣开源社区生态,打造实时分析型数据库领域的国际工业界标准。
Apache Doris 是一个基于MPP的现代化、高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。基于此,Apache Doris 在多维报表、用户画像、即席查询、实时大屏等诸多业务领域都能得到很好应用。
你可以基于 Apache Doris 快速构建一个简单易用并且性能强大的数据分析平台,非常易于上手,所需要付出的学习成本非常低。并且 Apache Doris 的分布式架构非常简洁,可以极大降低系统运维的工作量,这也是越来越多用户选择 Apache Doris的关键因素。
作为一款成熟的分析型数据库项目,Apache Doris 有以下优势:
- 性能优异:自带高效的列式存储引擎,减少数据扫描量的同时还实现了超高的数据压缩比。同时Doris还提供了丰富的索引结构来加速数据读取与过滤,利用分区分桶裁剪功能,Doris可以支持在线服务业务的超高并发,单节点最高可支持上千QPS。更进一步,Apache Doris 结合了向量化执行引擎来充分发挥现代化CPU并行计算能力,辅以智能物化视图技术实现预聚合加速,并可以通过查询优化器同时进行基于规划和基于代价的查询优化。通过上述多种方式,实现了极致的查询性能。
- 简单易用: 支持标准ANSI SQL语法,包括单表聚合、排序、过滤和多表Join、子查询等,还支持窗口函数、Grouping Set等复杂SQL语法,同时用户可以通过UDF和UDAF等自定义函数来拓展系统功能。除此以外,Apache Doris 还实现了MySQL协议兼容,用户可以通过各类客户端工具来访问Doris,并支持与BI工具的无缝对接。
- 架构精简: 系统只有两个Frontend(FE)和Backend(BE)两个模块,其中FE节点负责用户请求的接入、查询计划的解析、元数据存储及集群管理等工作,BE节点负责数据存储和查询计划的执行,自身就是一个完备的分布式数据库管理系统,用户无需安装任何第三方管控组件即可运行起Apache Doris 集群,并且部署和升级过程都非常简易。同时,任一模块都可以支持横向拓展,集群最高可以拓展到数百个节点,支持存储超过10PB的超大规模数据。
- 稳定可靠: 支持数据多副本存储,集群具备自愈功能,自身的分布式管理框架可以自动管理数据副本的分布、修复和均衡,副本损坏时系统可以自动感知并进行修复。节点扩容时,仅需一条SQL命令即可完成,数据分片会自动在节点间均衡,无需人工干预或操作。无论是扩容、缩容、单节点故障还是在升级过程中,系统都无需停止运行,可正常提供稳定可靠的在线服务。
- 生态丰富: 提供丰富的数据同步方式,支持快速加载来自本地、Hadoop、Flink、Spark、Kafka、SeaTunnel等系统中的数据,也可以直接访问MySQL、PostgreSQL、Oracle、S3、Hive、Iceberg、Elasticsearch等系统中的数据而无需数据复制。同时存储在Doris中的数据也可以被 Spark、Flink 读取,并且可以输出给上游数据应用进行展示分析。
如果想要了解更多详情,可以移步 Doris 官网&仓库一定可以解答你的疑惑的~
Doris 仓库:github.com/apache/dori…