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 等数据湖。
作为实时 OLAP引擎,Apache Doris 在查询速度上具有竞争优势。根据TPC-H和SSB-Flat基准测试结果,Doris可以提供比Presto、Greenplum和ClickHouse更快的性能。
至于其自我进化,过去两年无论是复杂查询还是平表分析,速度都提高了10倍以上。
Apache Doris 如此快的速度背后是有助于其性能的架构设计、特性和机制。
首先,Apache Doris 有一个基于成本的优化器(CBO),可以为复杂的大查询找出最有效的执行计划。具有完全矢量化的执行引擎,可以减少虚拟函数调用和缓存未命中的问题。基于MPP(大规模并行处理),可以充分发挥用户的机器和内核。在 Doris 中,查询执行是数据驱动的,意味着查询是否被执行取决于其相关数据是否准备好,这可以更有效地利用 CPU。
面向列的数据库的快速点查询
Apache Doris 是一个面向列的数据库,因此它可以使数据压缩和数据分片变得更容易更快。但这可能不适合诸如面向客户的服务之类的情况。在这些情况下,数据平台必须同时处理大量用户的请求(这些请求称为“高并发点查询”),而拥有列式存储引擎将放大每秒的 I/O 操作,尤其是当数据排列在平面表中时。
为了解决这个问题,Apache Doris 启用了混合存储,这意味着同时拥有行存储和列存储。
另外,由于点查询都是简单查询,因此调用查询规划器是不必要和浪费的,因此 Doris 为它们执行短路计划以减少开销。
高并发点查询开销的另一个大来源是SQL解析。为此,Doris 准备了声明。预先计算 SQL 语句并缓存它们,以便可以复用于类似的查询。
Apache Doris 提供了一系列数据摄取方法。
实时流写入:
批量写入:
对于数据更新,Apache Doris 需要提供的是,它同时支持 Merge on Read 和 Merge on Write,前者用于低频批量更新,后者用于实时写入。使用Merge on Write,当您执行查询时,最新的数据就已经准备好了,因此与Merge on Read相比,它可以将查询速度提高5到10倍。 从实现的角度来看,以下是一些常见的数据更新操作,Doris 都支持:
在某些情况下,数据更新是并发发生的,这意味着有大量新数据进入并试图修改现有数据记录,因此更新顺序非常重要。这就是为什么 Doris 允许您通过事务提交的顺序或序列列(您提前在表中指定的内容)来决定顺序。Doris 还支持根据指定谓词删除数据,这就是条件更新的方式。
除了查询和数据摄取方面的快速性能之外,Apache Doris 还提供服务可用性保证,具体如下: 从架构上来说,Doris 有两个进程:前端和后端。它们都很容易扩展。前端节点管理集群、元数据并处理用户请求;后端节点执行查询并能够自动数据平衡和自动恢复。支持集群升级和扩展,避免服务中断。
企业用户,尤其是金融或电子商务领域的用户,需要备份其集群或整个数据中心,以防出现不可抗力。所以Doris 2.0 提供了跨集群复制(CCR)。通过 CCR,用户可以做很多事情:
测试表明 Doris CCR 可以达到几分钟的数据延迟。最好的情况下可以达到硬件环境的速度上限。
Apache Doris 具有复杂的基于角色的访问控制,它允许在数据库、表、行和列级别进行细粒度的权限控制。
对于资源隔离,Doris 曾经实施了一个硬隔离方案,将后端节点划分为资源组,并将资源组分配给不同的工作负载。这个硬隔离计划简单又整洁。但有时用户需要更充分地利用其计算资源,因为某些资源组处于空闲状态。
因此,Doris 2.0 引入了工作负载组,而不是资源组。为工作负载组设置了关于其可以使用的资源数量的软限制。当达到该软限制时,同时有一些空闲资源可用。空闲资源将在工作负载组之间共享。用户还可以根据对空闲资源的访问来确定工作负载组的优先级。
Apache Doris 提供了许多功能,而且也易于使用。它支持标准SQL,并兼容MySQL协议和市场上大多数BI工具。 我们为提高可用性所做的另一项努力是称为“轻架构更改”的功能。这意味着如果用户需要添加或删除表中的某些列,他们只需要更新前端的元数据,而不必修改所有数据文件。光模式更改可以在几毫秒内完成。它还允许更改索引和列的数据类型。Light Schema Change 与 Flink-Doris-Connector 的结合意味着上游表的毫秒级同步。
半结构化数据的常见示例包括日志、可观测性数据和时间序列数据。这些案例需要无模式支持、较低的成本以及多维分析和全文搜索的能力。
在文本分析中,人们大多使用 LIKE 算子,因此我们花了很多精力来提高它的性能,包括将 LIKE 算子下推到存储层(以减少数据扫描),并引入 NGram Bloomfilter, Hyperscan 正则表达式匹配库和 Volnitsky 算法(用于子字符串匹配)。
我们还引入了用于文本标记化的倒排索引。它是模糊关键字搜索、全文搜索、等价查询和范围查询的强大工具。
基准测试结果显示,Apache Doris 在 Hive 表的查询中比 Trino 快 3~5 倍。它是以下几个特征的共同结果:
计算节点是 2.0 版本中新引入的数据湖解决方案。与普通后端节点不同,计算节点是无状态的,不存储任何数据。它们也不参与集群扩展期间的数据平衡。这样,他们就可以在计算高峰期灵活、轻松地加入集群。
另外,Doris还允许将外部表的计算结果写入Doris中形成视图。这与物化视图的思路类似:用空间换取速度。对外部表执行查询后,可以将结果放入Doris内部。当后续有类似的查询时,系统可以直接从 Doris 读取先前查询的结果,从而加快速度。
分层存储的主要目的是省钱。分层存储是指将热数据和冷数据分离到不同的存储中,热数据是经常访问的数据,冷数据是不经常访问的数据。它允许用户将热数据放入快速但昂贵的磁盘(例如SSD和HDD)中,将冷数据放入对象存储中。
粗略来说,对于80%冷数据组成的数据资产,分层存储可以降低您70%的存储成本。
网站:https: //doris.apache.org/
GitHub:https: //github.com/apache/doris/ 原文作者:Apache Doris