Apache Doris:下一代实时数据仓库
概念
- Apache Doris 是一个开源实时数据仓库。它可以从各种数据源收集数据,包括关系数据库(MySQL、PostgreSQL、SQL Server、Oracle等)、日志和来自物联网设备的时间序列数据。能够进行报告、即席分析、联合查询和日志分析,因此可用于支持仪表板、自助式 BI、A/B 测试、用户行为分析等。
Apache Doris 同时支持批量导入和流式写入。可以与 Apache Spark、Apache Hive、Apache Flink、Airbyte、DBT 和 Fivetran 很好地集成。还可以连接到 Apache Hive、Apache Hudi、Apache Iceberg、Delta Lake 和 Apache Paimon 等数据湖。
Heterogeneous Data 异构数据
Application 应用程序
RDBMS
MySQL PostgreSQL SQL Server Oracle
Apache Doris Reporting Ad-hoc Analysis Federated Queries Apache Doris报告特别分析联邦查询
Dashboarding 仪表盘
Self-Service BI 自助式BI
Data Integration /ETL 数据集成/ETL
Sales Analysis 销售分析
Log Processing 日志处理
CDC
ETLELT
User Behavior Analysis 用户行为分析
log
Batch Processing (Spark, Hive) 批处理(Spark, Hive)
High-Concurrency Data Services 高并发数据服务
A/B Testing Log Analysis A/B测试日志分析
IOT 物联网
time series data 时间序列数据
Stream Processing (Flink) 流处理(Flink)
User Profiling 用户分析
Offline Data Lake 离线数据湖
Tools (Airbyte, DBT, Fivtn) 工具(Airbyte, DBT, Fivtn)
Hive
Time Series Data Analysis 时间序列数据分析
- 作为实时 OLAP引擎,Apache Doris 在查询速度上具有竞争优势。根据TPC-H和SSB-Flat基准测试结果,Doris可以提供比Presto、Greenplum和ClickHouse更快的性能。
至于其自我进化,过去两年无论是复杂查询还是平表分析,速度都提高了10倍以上。
架构设计
快速的原因——其性能的架构设计、特性和机制
基于成本的优化器
- Apache Doris 有一个基于成本的优化器(CBO),可以为复杂的大查询找出最有效的执行计划。具有完全矢量化的执行引擎,可以减少虚拟函数调用和缓存未命中的问题。基于MPP(大规模并行处理),可以充分发挥用户的机器和内核。在 Doris 中,查询执行是数据驱动的,意味着查询是否被执行取决于其相关数据是否准备好,这可以更有效地利用 CPU。
面向列的数据库的快速点查询
- Apache Doris 是一个面向列的数据库,因此它可以使数据压缩和数据分片变得更容易更快。但这可能不适合诸如面向客户的服务之类的情况。在这些情况下,数据平台必须同时处理大量用户的请求(这些请求称为“高并发点查询”),而拥有列式存储引擎将放大每秒的 I/O 操作,尤其是当数据排列在平面表中时。
为了解决这个问题,Apache Doris 启用了混合存储,这意味着同时拥有行存储和列存储。
- 另外,由于点查询都是简单查询,因此调用查询规划器是不必要和浪费的,因此 Doris 为它们执行短路计划以减少开销。
高并发点查询开销的另一个大来源是SQL解析。为此,Doris 准备了声明。预先计算 SQL 语句并缓存它们,以便可以复用于类似的查询。 - 架构精简:系统只有Frontend(FE)和Backend(BE)两个模块,其中FE节点负责用户请求的接入、查询计划的解析、元数据存储及集群管理等工作,BE节点负责数据存储和查询计划的执行,自身就是一个完备的分布式数据库管理系统,用户无需安装任何第三方管控组件即可运行起Apache Doris 集群,并且部署和升级过程都非常简易。同时,任一模块都可以支持横向拓展,集群最高可以拓展到数百个节点,支持存储超过10PB的超大规模数据。
SQL Parse SQL解析
Preparestatement Map 映射
Analyzer 分析仪
SQL1 - cached short-circuit plant SQL1缓存的短路装置
RPC
Storage Engine
Short-Circuit Plan存储引擎
SQLN - cached short-circuit planN SQLN -缓存的短路计划n - 性能优异:自带高效的列式存储引擎,减少数据扫描量的同时还实现了超高的数据压缩比。同时Doris还提供了丰富的索引结构来加速数据读取与过滤,利用分区分桶裁剪功能,Doris可以支持在线服务业务的超高并发,单节点最高可支持上千QPS。更进一步,Apache Doris 结合了向量化执行引擎来充分发挥现代化CPU并行计算能力,辅以智能物化视图技术实现预聚合加速,并可以通过查询优化器同时进行基于规划和基于代价的查询优化。通过上述多种方式,实现了极致的查询性能。
数据摄取
-
Apache Doris 提供了一系列数据摄取方法。
-
1.实时流写入:
Stream Load:可以应用此方法通过 HTTP 写入本地文件或数据流。具有线性可扩展性,在某些用例中可以达到每秒 1000 万条记录的吞吐量。
Flink-Doris-Connector:通过内置的 Flink CDC,该连接器将 OLTP 数据库中的数据提取到 Doris。至此,我们已经实现了MySQL、Oracle的数据自动同步到Doris。
例程加载:这是从 Kafka 消息队列订阅数据。
Insert Into:当您尝试在 Doris 内部进行 ETL 时(例如将数据从一个 Doris 表写入另一个 Doris 表)尤其有用。 -
2.批量写入:
Spark Load:通过这种方法,您可以在写入 Doris 之前利用 Spark 资源对来自 HDFS 和对象存储的数据进行预处理。
Broker Load:支持 HDFS 和 S3 协议。
insert into select from :这个简单的语句允许您将 Doris 连接到各种存储系统、数据湖和数据库。 -
生态丰富:提供丰富的数据同步方式,支持快速加载来自本地、Hadoop、Flink、Spark、Kafka、SeaTunnel等系统中的数据,也可以直接访问MySQL、PostgreSQL、Oracle、S3、Hive、Iceberg、Elasticsearch等系统中的数据而无需数据复制。同时存储在Doris中的数据也可以被 Spark、Flink 读取,并且可以输出给上游数据应用进行展示分析。
数据更新
- 1.对于数据更新,Apache Doris 需要提供的是,它同时支持 Merge on Read 和 Merge on Write,前者用于低频批量更新,后者用于实时写入。
- 使用Merge on Write,当您执行查询时,最新的数据就已经准备好了,因此与Merge on Read相比,它可以将查询速度提高5到10倍。
- 从实现的角度来看,以下是一些常见的数据更新操作,Doris 都支持:
Upsert:替换或更新整行
部分列更新:仅更新一行中的几列
条件更新:通过组合几个条件过滤掉一些数据,以便替换或删除它
Insert Overwrite:重写表或分区 - 在某些情况下,数据更新是并发发生的,这意味着有大量新数据进入并试图修改现有数据记录,因此更新顺序非常重要。这就是为什么 Doris 允许您通过事务提交的顺序或序列列(您提前在表中指定的内容)来决定顺序。Doris 还支持根据指定谓词删除数据,这就是条件更新的方式。
服务可用性和数据可靠性
- 除了查询和数据摄取方面的快速性能之外,Apache Doris 还提供服务可用性保证,具体如下:
从架构上来说,Doris 有两个进程:前端和后端。它们都很容易扩展。 - 前端节点管理集群、元数据并处理用户请求;后端节点执行查询并能够自动数据平衡和自动恢复。支持集群升级和扩展,避免服务中断。
-
- 稳定可靠:支持数据多副本存储,集群具备自愈功能,自身的分布式管理框架可以自动管理数据副本的分布、修复和均衡,副本损坏时系统可以自动感知并进行修复。节点扩容时,仅需一条SQL命令即可完成,数据分片会自动在节点间均衡,无需人工干预或操作。无论是扩容、缩容、单节点故障还是在升级过程中,系统都无需停止运行,可正常提供稳定可靠的在线服务。
跨集群复制
- 企业用户,尤其是金融或电子商务领域的用户,需要备份其集群或整个数据中心,以防出现不可抗力。所以Doris 2.0 提供了跨集群复制(CCR)。通过 CCR,用户可以做很多事情:
灾难恢复:用于快速恢复数据服务
读写分离:主集群+从集群;一本用于阅读,一本用于写作
集群隔离升级:对于集群扩展,CCR允许用户预先创建备份集群进行试运行,以便清除可能的不兼容问题和错误。
测试表明 Doris CCR 可以达到几分钟的数据延迟。最好的情况下可以达到硬件环境的速度上限。
Source cluster 源集群
Obtain ta binloy pates 获取该binloy表
Replay -eta binlo 重播 -eta binlo
Target cluster 目标集群
Pull data 提取数据
多租户管理
- Apache Doris 具有复杂的基于角色的访问控制,它允许在数据库、表、行和列级别进行细粒度的权限控制。
- 对于资源隔离,Doris 曾经实施了一个硬隔离方案,将后端节点划分为资源组,并将资源组分配给不同的工作负载。这个硬隔离计划简单又整洁。但有时用户需要更充分地利用其计算资源,因为某些资源组处于空闲状态。
- 因此,Doris 2.0 引入了工作负载组,而不是资源组。为工作负载组设置了关于其可以使用的资源数量的软限制。当达到该软限制时,同时有一些空闲资源可用。空闲资源将在工作负载组之间共享。用户还可以根据对空闲资源的访问来确定工作负载组的优先级。
便于使用
- Apache Doris 提供了许多功能,而且也易于使用。它支持标准SQL,并兼容MySQL协议和市场上大多数BI工具。
我们为提高可用性所做的另一项努力是称为“轻架构更改”的功能。这意味着如果用户需要添加或删除表中的某些列,他们只需要更新前端的元数据,而不必修改所有数据文件。 - 简单易用:支持标准ANSI SQL语法,包括单表聚合、排序、过滤和多表Join、子查询等,还支持窗口函数、Grouping Set等复杂SQL语法,同时用户可以通过UDF和UDAF等自定义函数来拓展系统功能。除此以外,Apache Doris 还实现了MySQL协议兼容,用户可以通过各类客户端工具来访问Doris,并支持与BI工具的无缝对接。
半结构化数据分析
半结构化数据的常见示例包括日志、可观测性数据和时间序列数据。这些案例需要无模式支持、较低的成本以及多维分析和全文搜索的能力。
在文本分析中,人们大多使用 LIKE 算子,因此我们花了很多精力来提高它的性能,包括将 LIKE 算子下推到存储层(以减少数据扫描),并引入 NGram Bloomfilter, Hyperscan 正则表达式匹配库和 Volnitsky 算法(用于子字符串匹配)。
我们还引入了用于文本标记化的倒排索引。它是模糊关键字搜索、全文搜索、等价查询和范围查询的强大工具。
据仓一体
为了让用户构建高性能的数据湖和统一的查询网关,Doris 可以映射、缓存和自动刷新来自外部源的元数据。它支持 Hive Metastore 和几乎所有开放数据 Lakehouse 格式。您可以将其连接到关系数据库、Elasticsearch 和许多其他来源。它允许您在外部表上重用自己的身份验证系统,例如 Kerberos 和 Apache Ranger。
- 基准测试结果显示,Apache Doris 在 Hive 表的查询中比 Trino 快 3~5 倍。它是以下几个特征的共同结果:
高效的查询引擎
热数据缓存机制
计算节点
Doris 视图 - 计算节点是 2.0 版本中新引入的数据湖解决方案。与普通后端节点不同,计算节点是无状态的,不存储任何数据。它们也不参与集群扩展期间的数据平衡。这样,他们就可以在计算高峰期灵活、轻松地加入集群。
另外,Doris还允许将外部表的计算结果写入Doris中形成视图。这与物化视图的思路类似:用空间换取速度。对外部表执行查询后,可以将结果放入Doris内部。当后续有类似的查询时,系统可以直接从 Doris 读取先前查询的结果,从而加快速度。
分层存储
- 分层存储的主要目的是省钱。分层存储是指将热数据和冷数据分离到不同的存储中,热数据是经常访问的数据,冷数据是不经常访问的数据。它允许用户将热数据放入快速但昂贵的磁盘(例如SSD和HDD)中,将冷数据放入对象存储中。
- 粗略来说,对于80%冷数据组成的数据资产,分层存储可以降低您70%的存储成本。
词条
- Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。基于此,Apache Doris 能够较好的满足报表分析、即时查询、统一数仓构建、数据湖联邦查询加速等使用场景,用户可以在此之上构建用户行为分析、AB 实验平台、日志检索分析、用户画像分析、订单分析等应用。
诞生
- Apache Doris 最早是诞生于百度广告报表业务的 Palo 项目,2017 年正式对外开源,2018 年 7 月由百度捐赠给 Apache 基金会进行孵化,之后在 Apache 导师的指导下由孵化器项目管理委员会成员进行孵化和运营。 [4-5]Apache Doris 社区已经聚集了来自不同行业近百家企业的 300 余位贡献者,并且每月活跃贡献者人数也接近 100 位。2022 年 6 月,Apache Doris 成功从 Apache 孵化器毕业,正式成为 Apache 顶级项目(Top-Level Project,TLP)。
- Apache Doris可以满足多种数据分析需求,例如固定历史报表,实时数据分析,交互式数据分析和探索式数据分析等,令数据分析工作简单高效。
技术概述
- ApacheDoris 主要基于C++ 和Java 开发,集成了Google Mesa 和Apache Impala 的技术。将Mesa 与Impala进行组合的基础上,Doris 被设计为一个不依赖于其他系统的简单且单一紧密耦合的系统,并实现了MySQL协议,使得用户可以像使用MySQL 无缝过渡到Doris,包括各种报表应用都可以通过MySQL协议连接Doris,同时获得高并发低延迟点查询性能,而且还能进行高吞吐量的即席分析查询。Doris 不仅提供大批量数据加载,而且还提供近乎实时的小批量,甚至流数据加载。此外Doris还具备可用性,可靠性,容错性和可扩展性。
- Doris整体架构如下,Doris 架构非常简单,只有两类进程
Frontend(FE),主要负责用户请求的接入、查询解析规划、元数据的管理、节点管理相关工作。
Backend(BE),主要负责数据存储、查询计划的执行。 - 这两类进程都是可以横向扩展的,单集群可以支持到数百台机器,数十 PB 的存储容量。并且这两类进程通过一致性协议来保证服务的高可用和数据的高可靠。这种高度集成的架构设计极大的降低了一款分布式系统的运维成本。
- 在使用接口方面,Doris 采用 MySQL 协议,高度兼容 MySQL 语法,支持标准 SQL,用户可以通过各类客户端工具来访问 Doris,并支持与 BI 工具的无缝对接。
在存储引擎方面,Doris 采用列式存储,按列进行数据的编码压缩和读取,能够实现极高的压缩比,同时减少大量非相关数据的扫描,从而更加有效利用 IO 和 CPU 资源。 - Doris 也支持比较丰富的索引结构,来减少数据的扫描:
1.支持 Sorted Compound Key Index,可以最多指定三个列组成复合排序键,通过该索引,能够有效进行数据裁剪,从而能够更好支持高并发的报表场景
2.Z-order Index :使用 Z-order 索引,可以高效对数据模型中的任意字段组合进行范围查询
3.Min/Max 索引 :有效过滤数值类型的等值和范围查询
4.Bloom Filter :对高基数列的等值过滤裁剪非常有效
5.Invert Index :能够对任意字段实现快速检索 - 在存储模型方面,Doris 支持多种存储模型,针对不同的场景做了针对性的优化:
1.Aggregate Key 模型:相同 Key 的 Value 列合并,通过提前聚合大幅提升性能
2.Unique Key 模型:Key 唯一,相同 Key 的数据覆盖,实现行级别数据更新
3.Duplicate Key 模型:明细数据模型,满足事实表的明细存储 - Doris 也支持强一致的物化视图,物化视图的更新和选择都在系统内自动进行,不需要用户手动选择,从而大幅减少了物化视图维护的代价。
- 在查询引擎方面,Doris 采用 MPP 的模型,节点间和节点内都并行执行,也支持多个大表的分布式 Shuffle Join,从而能够更好应对复杂查询。
- Doris 查询引擎是向量化的查询引擎,所有的内存结构能够按照列式布局,能够达到大幅减少虚函数调用、提升 Cache 命中率,高效利用 SIMD 指令的效果。在宽表聚合场景下性能是非向量化引擎的 5-10 倍。
Input Batch 输入批处理
SCAN 扫描
OPERATOR 操作符
FILTER OPERATOR 过滤操作符
AGGREGATION OPERATOR 聚合算子
Tuple 元组
Record Batch 元组
SCAN OPERATOR 扫描操作符
FILTER OPERATOR
AGGREGATION OPERATOR
Vectors with N records 有N条记录的向量
Vectors records 向量记录- Doris 采用了 Adaptive Query Execution 技术, 可以根据 Runtime Statistics 来动态调整执行计划,比如通过 Runtime Filter 技术能够在运行时生成生成 Filter 推到 Probe 侧,并且能够将 Filter 自动穿透到 Probe 侧最底层的 Scan 节点,从而大幅减少 Probe 的数据量,加速 Join 性能。Doris 的 Runtime Filter 支持 In/Min/Max/Bloom Filter。
在优化器方面 Doris 使用 CBO 和 RBO 结合的优化策略,RBO 支持常量折叠、子查询改写、谓词下推等,CBO 支持 Join Reorder。CBO 还在持续优化中,主要集中在更加精准的统计信息收集和推导,更加精准的代价模型预估等方面。
适用场景
- 如下图所示,数据源经过各种数据集成和加工处理后,通常会入库到实时数仓 Doris 和离线湖仓(Hive, Iceberg, Hudi 中),Apache Doris 被广泛应用在以下场景中:
Data Sources 数据源
Data Ingestion and Processing 数据摄取和处理
Unified Data Warehouse 统一数据仓库
Usage Story 使用内存
Data base
CDC(Change Data Capture) CDC(变更数据捕获)
Report Analysis 报告分析
Web Log Web日志
Streaming ETL (Flink) 流媒体ETL (Flink)
DORIS
Ad-hoc Analysis
Real Time Data Warehoe 实时数据仓库
Hobile Log Hobbile 日志
ETL
Bach ETL Spark
Federated Query 联邦查询
Time Series Dats 时间序列日期
εTL DT
Data API 数据API
Data Intagration Toul 数据集成工具
Dts Lake |Hie/berg/Haadi |
Machine Learning 数据集成工具 - 报表分析
1.实时看板 (Dashboards)
2.面向企业内部分析师和管理者的报表
3.面向用户或者客户的高并发报表分析(Customer-facing Analytics)。比如面向网站主的站点分析、面向广告主的广告报表,并发通常要求成千上万的 QPS ,查询延时要求毫秒级响应。著名的电商公司京东在广告报表中使用 Apache Doris ,每天写入 100 亿行数据,查询并发 QPS 上万,99 分位的查询延时 150ms。 - 即席查询(Ad-hoc Query):面向分析师的自助分析,查询模式不固定,要求较高的吞吐。小米公司基于 Doris 构建了增长分析平台(Growing Analytics,GA),利用用户行为数据对业务进行增长分析,平均查询延时 10s,95 分位的查询延时 30s 以内,每天的 SQL 查询量为数万条。
- 统一数仓构建 :一个平台满足统一的数据仓库建设需求,简化繁琐的大数据软件栈。海底捞基于 Doris 构建的统一数仓,替换了原来由 Spark、Hive、Kudu、Hbase、Phoenix 组成的旧架构,架构大大简化。
- 数据湖联邦查询:通过外表的方式联邦分析位于 Hive、Iceberg、Hudi 中的数据,在避免数据拷贝的前提下,查询性能大幅提升。