亲爱的社区小伙伴们,我们很高兴地向大家宣布,在近期我们迎来了 Apache Doris 3.0 版本的正式发布,欢迎大家下载使用体验!
从 3.0 系列版本开始,Apache Doris 开始支持存算分离模式,用户可以在集群部署时选择采用存算一体模式或存算分离模式。基于云原生存算分离的架构,用户可以通过多计算集群实现查询负载间的物理隔离以及读写负载隔离,并借助对象存储或 HDFS 等低成本的共享存储系统来大幅降低存储成本。
3.0 版本是 Apache Doris 在湖仓一体演化路线上的重要里程碑版本。在 3.0 版本中 Apache Doris 增加了数据湖写回功能,用户可以在 Apache Doris 中完成多个数据源之间的数据分析、共享、处理、存储操作。结合异步物化视图等能力,Apache Doris 可以作为企业统一的湖仓数据处理引擎,帮助用户更好的管理湖、仓、数据库中的数据。与此同时,3.0 版本引入了 Trino Connector 类型,用户可以快速使用 Trino Connector 来连接或适配更多数据源、并可以利用 Apache Doris 的高性能计算引擎提供比 Trino 更快的数据查询能力。
3.0 版本同样对 ETL 批处理场景进行了增强,对insert into select
、delete
和 update
操作提供了显式事务支持;对查询执行过程中的可观测性进行了增强。
在性能方面,3.0 版本的查询优化器在框架能力、基础设施以及规则扩充等方面做了重要增强,针对更复杂更多样的业务场景提供更极致的优化能力,盲测性能更高。实现了自适应的 Runtime Filter 计算方式,能够在运行时根据数据大小准确估算 Runtime Filter,在大数据量和高压力场景下有更好的性能表现。对异步物化视图的构建能力、透明改写能力以及性能均进行了增强,使得物化视图在查询加速、数据建模等场景具有更好的稳定性和易用性。
在 3.0 版本的研发过程中,有超过 170 名贡献者为 Apache Doris 提交了近 5000 个优化与修复。 来自飞轮科技、百度、美团、字节跳动、腾讯、阿里、快手、华为、天翼云等企业的贡献者与社区深度共建,贡献了大量来自真实业务场景下测试 Case 来帮助我们持续打磨、共同改进,在此向所有参与版本研发、测试和需求反馈的贡献者们表示最衷心的感谢。
从 Apache Doris 3.0 版本开始,Apache Doris 开始支持存算分离模式,用户可以在集群部署时选择采用存算一体模式或存算分离模式。
全新存算分离模式对计算与存储进行了解耦,计算节点不再存储主数据,而是引入共享存储层(HDFS 与对象存储)作为统一的数据主存储空间,计算资源和存储资源可以独立扩缩容,为用户带来了多方面价值:
在存算一体模式中,Apache Doris 整体由 Frontend(FE)和 Backend(BE)两类进程组成,其中 FE 节点主要负责用户请求接入、查询解析规划、元数据管理和集群管理等相关工作,BE 节点主要负责数据存储和查询计划的执行,多 BE 节点间采取 MPP 分布式计算架构,通过多副本一致性协议来帮助服务的高可用和数据的高可靠。
新兴云计算基础设施的成熟,无论是公有云、私有云以及基于 K8s 的容器平台,云计算基础设施的革新催生了新的需求,越来越多用户期待 Apache Doris 针对云计算基础设施提供更加深度的适配,以便提供更加灵活强大的弹性能力,因此飞轮科技团队早在 2022 年基于 Apache Doris 设计并实现了云原生存算分离版本(SelectDB Cloud),在经过数百家企业近两年的大规模生产打磨后,将其贡献回 Apache Doris 社区,即当前 3.0 版本的存算分离模式。
在存算分离模式下,Apache Doris 整体架构演化成元数据层、计算层和共享存储层三层:
全新存算分离架构最大的设计亮点在于将 FE 全内存的元数据模式演变成共享的元数据服务,这一方案的优势在于,元数据服务提供了全局一致的状态视图,任何节点可以直接提交写入,不再需要经过 FE 做 Publish。写入时数据进入共享存储,元数据进入元数据服务,可以有效控制共享存储上的小文件数量,同时单表的实时写入性能和存算一体相差无几,整个系统的写入能力不再受限于单 FE 的处理能力。
基于全局一致的状态视图,在数据 GC 时,我们采用了设计上容易证明正确性和效率更高的正向数据删除。具体而言,将共享存储中的数据纳入到在共享元数据服务提供的全局一致视图中,数据生成时绑定一个事务,元数据删除时也绑定一个事务,以此可以实现删除和写入不能一起成功,视图中记录了哪些数据需要删除,异步删除过程只需要根据事务记录正向删除数据即可,不需要反向 GC。
未来随着 FE 中 Tablet 相关的 Meta 进入共享服务,Doris 集群规模也不再受限于单 FE 内存。基于共享的元数据服务和正向的数据删除技术,在此基础上可以便捷地扩展数据共享、轻量克隆等功能。
业界还有另一种存算分离架构的设计方案,将数据和 BE 节点的 Meta 存放在共享对象存储或者 HDFS 中,该方案会有如下的问题:
在 Apache Doris 3.0 版本正式发版后,我们对该方案实时数据写入性能与 Apache Doris 进行了对比。在此我们在相同计算资源下分别模拟 500 并发任务写入 10000 个 500 行的数据文件和 50 并发任务写入 250 个 20000 行的数据文件,可以看到在 50 并发下 Apache Doris 存算分离和存算一体模式的微批写入性能基本相当,而该方案写入性能与 Apache Doris 差距达到 100 倍。在 500 并发下,Apache Doris 存算分离模式性能稍有损耗,但对比该方案仍有超过 11 倍的巨大优势。为了保证测试公平性,Apache Doris 并未开启 Group Commit 服务端攒批的能力(该方案不具备此能力),而在开启 Group Commit 后实时写入能力还将进一步增强。
此外该方案在实时写入方面还存在稳定性和成本问题:
与之相比,Doris 3.0 版本将 FE 全内存的元数据模式演变成共享的元数据服务有效地克服了以上问题。
由于存算分离模式下数据需要从远端共享存储系统中读取,因此数据传输的主要瓶颈,从存算一体模式下的磁盘 IO 转变为存算分离模式下的网络带宽,在一定程度上会造成性能损耗。
为了加速数据访问,Apache Doris 实现了基于本地磁盘的高速缓存机制,并提供 LRU 和 TTL 两种高效的缓存管理策略,并对索引相关的数据进行了优化,旨在最大程度上缓存用户常用数据、提升查询性能。新导入的数据将异步写入缓存中,以加速最新数据的首次访问。如果查询所需数据不在缓存中,系统将从远端存储中读取该数据进内存并同步写入缓存中,以便于后续查询。在涉及多计算集群的应用场景中,Apache Doris 提供缓存预热功能,当新计算集群建立时,用户可以选择对特定的数据(如表或分区)进行预热,以进一步提高查询效率。
在此我们分别对存算一体模式和存算分离模式进行了不同缓存下的性能测试,以 TPC-DS 1TB 测试集为例,主要结果如下:
在写入性能方面,我们在相同计算资源下分别模拟了批量导入和高并发实时导入两大场景,存算一体模式和存算分离模式的写入性能对比结论如下:
参考文档: 存算分离
尽管 Apache Doris 定位于实时数据仓库,在以往版本中一直不拘于数据仓库的能力边界,在湖仓一体方向持续发力。而 3.0 版本是 Apache Doris 在湖仓一体路线上的重要里程碑版本,从 3.0 版本开始,Apache Doris 在湖仓一体场景的能力臻于完善。对于湖仓一体,我们认为其最核心的理念即数据无界、湖仓融合:
数据无界:将 Apache Doris 作为统一查询处理引擎,打破数据在不同系统间的屏障,在数据仓库、数据湖乃至数据流、本地数据文件等所有数据源端都能提供一致且极速的分析处理体验。
湖仓融合:数据湖架构日益复杂,增加了用户技术选型成本与维护成本。同时实现多个系统一致的细粒度权限管控也变得非常困难,实时性也不足。为应对这一挑战,Apache Doris 融入了湖的核心特征,将其打造成一个轻量、高效的原生实时湖仓。
查询加速是湖仓一体化进程中的重要一环。借助 Apache Doris 强大的分布式查询引擎,可以帮助用户对湖仓数据进行快速分析。在 TPC-H 和 TPC-DS 标准测试集上,Apache Doris 的平均查询性能是 Trino/Presto 的 3-5 倍。
在 3.0 版本中,我们重点针对用户实际生产环境中的湖仓查询加速场景进行了优化,包括:
后续我们将进一步针对性的提升真实业务场景下的查询加速性能,提升用户实际感受,构建业界领先的湖仓查询加速引擎。
在之前的版本中,Apache Doris 已经支持了 10 余种主流湖、仓、关系型数据库的连接器。在 3.0 版本中,我们引入了 Trino Connector 兼容框架,极大扩展了 Apache Doris 可连接的数据源。借助该框架,仅需简单适配,用户即可通过 Doris 访问对应的数据源,并利用 Doris 的极速计算引擎进行数据分析。
目前 Doris 已完成 Delta Lake、Kudu、BigQuery、Kafka、TPCH、TPCDS 等多种 Connector 的适配,也欢迎所有开发者参考开发指南,为 Apache Doris 适配更多数据源。
参考文档:
在 3.0 版本中,Apache Doris 增加了 Hive、Iceberg 数据写回功能。写回功能支持用户直接通过 Doris 创建 Hive、Iceberg 表,并将数据写入到表中。该功能使得 Apache Doris 在湖仓数据处理能力上形成闭环,用户可以在 Apache Doris 中完成多个数据源之间的数据分析、共享、处理、存储操作。
在后续的迭代版本中,Apache Doris 将进一步完善对数据湖表格式的支持以及存储 API 开放性。
参考文档:数据湖构建
在过去发布的 2.0 和 2.1 版本中,Apache Doris 陆续引入了倒排索引、N-Gram Bloom Filter、Variant 数据类型等重磅特性,支持高性能的全文检索和任意维度分析,对复杂半结构化数据的存储和处理分析更加灵活高效。
在 3.0 版本中,我们继续对这一场景能力进行了全面增强,在应对半结构化数据分析和日志检索分析场景的挑战时更加得心应手。
Variant 数据类型在经过大规模生产打磨后,已具备充分的稳定性,成为 JSON 数据存储和分析的首选。在 3.0 版本中我们对 Variant 类型进行了多项优化:
倒排索引自 2.0 版本开始被引入起,经历一年多的打磨,目前已具备较高的成熟度,在数百家企业的生产环境中长期运行。在 3.0 版本中,我们对倒排索引进行了多项优化:
array_contains
查询;match_phrase_*
功能进行增强,包括支持词距 slop、短语前缀匹配 match_phrase_prefix
等。数据加工在数据仓库中是一个常见的场景,通常需要多个数据变更作为一个事务。Doris 3.0 对insert into select
、delete
和 update
操作提供了显式事务支持。具体的应用场景比如:
delete
和 insert into select
。
BEGIN; DELETE FROM table WHERE date >= "2024-07-01" AND date <= "2024-07-31"; INSERT INTO table SELECT * FROM stage_table; COMMIT;insert into select
,在一个事务中去执行,任何一步失败只需要重新开始执行即可。
BEGIN WITH LABEL label_etl_1; INTO table1 SELECT * FROM stage_table1; INSERT INTO table SELECT * FROM stage_table; COMMIT;参考文档: 事务 目前 CCR 暂未支持显示事务同步。
backend_active_tasks
系统表提供了每个 Query 在每个 BE 上的实时资源消耗信息,可以通过 SQL 对系统表做分析计算,进而实时获得每个 Query 的资源使用量,有利于用户发现大查询或者不合理的工作负载。在 Apache Doris 3.0 版本中,对多表物化视图的构建能力进行了增强并提高稳定性,拓展了透明改写的能力、透明改写性能提升 2 倍,重构了同步物化视图的透明改写逻辑并拓展了透明改写的能力,同时在异步物化视图的易用性上做了增强,让物化视图在查询加速,数据建模等场景更好用、更稳定。
在 3.0 版本中,查询优化器在框架能力、分布式计划支持、优化器基础设施以及规则扩充等方面做了重要增强,支持更复杂更多样的业务场景、提供更极致的优化能力,对于复杂 SQL 有更高的盲测性能:
Runtime Filter 是否能够准确生成对查询性能的影响至关重要,在过去 Doris 非常依赖于用户手工设置或者优化器根据统计信息来生成,在某些情况下一旦设置不准确将会带来性能抖动。
在 3.0 版本实现了自适应的 Runtime Filter 计算方式,能够在运行时根据数据大小准确估算 Runtime Filter,在大数据量和高压力场景下有更好的性能表现。
我们对 3.0 版本与 2.1 版本分别在 TPC-DS 和 TPC-H 测试数据集上进行了盲测性能测试,查询性能分别提升了 7.3% 以及 6.2%。
从 3.0 版本开始支持增加对 Java UDTF 的支持,主要操作如下:
evaluate
方法,注意 UDTF 函数的返回值必须是 Array 类型。
public class UDTFStringTest { public ArrayList<String> evaluate(String value, String separator) { if (value == null || separator == null) { return null; } else { return new ArrayList<>(Arrays.asList(value.split(separator))); } } }java-utdf
和 java-utdf_outer
, outer
的后缀在表函数生成 0 行数据时添加一行Null
数据。
CREATE TABLES FUNCTION java-utdf(string, string) RETURNS array<string> PROPERTIES ( "file"="file:///pathTo/java-udaf.jar", "symbol"="org.apache.doris.udf.demo.UDTFStringTest", "always_nullable"="true", "type"="JAVA_UDF" );参考文档: Java UDF - UDTF
生成列是一种特殊的数据库表列,其值由其他列的值计算而来,而不是直接由用户插入或更新。该功能支持预先计算表达式的结果,并存储在数据库中,适用于需要频繁查询或进行复杂计算的场景。
生成列可以在数据导入或更新时自动根据预定义的表达式计算结果,并将这些结果持久化存储。在后续的查询过程中,可以直接访问这些已经计算好的结果,而无需在查询时再进行复杂的计算,从而显著减少查询时的计算负担,提升查询性能。
从 3.0 版本开始 Apache Doris 支持生成列功能,创建表时可以指定列为 Generated 列。Generated 列可在写入时,根据定义的表达式,自动获取计算结果。相比于 Default value,可以定义更为复杂的表达式,但不可以显式写入指定的值。
重构同步物化视图选择逻辑,将选择逻辑从 RBO 迁移至 CBO,使其与异步物化视图保持一致。
此功能默认开启。如遇到问题,可使用开关 set global enable_sync_mv_cost_based_rewrite = false
回退到 RBO 模式。
在之前的版本中,Routine Load 存在部分体验性问题:任务在 BE 节点之间调度不均、调度不及时,配置繁琐、需要同时改 FE 和 BE 的多个配置进行调优,稳定性不够高、重启或升级等都可能导致 Routine Load Job 暂停,需要人工介入才能恢复。我们针对这些问题对 Routine Load 做了大量的优化,使得 Routine Load 更高效、稳定且易用,为用户提供更好的体验。
cpu_resource_limit
将不再支持,所有的资源隔离方式都依赖 Workload Group 实现。jdk-17.0.10_linux-x64_bin.tar.gz
。在 3.0 版本正式发布之前,存算分离架构在 SelectDB 数百家企业的生产环境已经得到近两年的大规模打磨,同时来自百度、美团、字节跳动、腾讯、阿里、快手、华为、天翼云等企业多名贡献者与社区深度共建,贡献了大量来自真实业务场景下测试 Case,使得 3.0 版本在功能易用性和系统稳定性得到了有力验证,推荐有存算分离需求的用户下载 3.0 版本进行尝鲜。
后续我们也将加快发版迭代节奏,力求给所有用户带来更稳定的版本体验。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。