程序员冈刀,目前就职于美团,java开发工程师,研究生。2022年,毕业于北京邮电大学电子工程学院、电子与通信工程专业。个人公众号《代码废柴》欢迎关注。
一、进入Doris世界
Apache Doris是一个基于MPP架构的高性能实时分析数据库,以其极快的速度和易于使用而闻名。在海量数据下返回查询结果只需亚秒级的响应时间,不仅支持高并发点查询场景,还支持高吞吐量复杂分析场景。基于此,Apache Doris可以更好地满足报表分析、自定义查询、统一数据仓库、数据湖查询加速等场景。用户可以在此基础上构建用户行为分析、AB测试平台、日志检索分析、用户画像分析、订单分析等应用。
Apache Doris最初作为百度广告报告业务的Palo项目诞生,2017年正式开源,2018年7月百度捐赠给Apache基金会孵化,随后在Apache导师的指导下由孵化器项目管理委员会成员孵化运营。目前,Apache Doris社区已经聚集了来自不同行业近100家公司的300多名贡献者,活跃贡献者的数量接近每个月100人。Apache Doris于2022年6月成功从Apache孵化器毕业,成为顶级项目。
Apache Doris现在在中国和世界各地拥有广泛的用户基础,到今天为止,Apache Doris在全球超过500家公司的生产环境中使用。在中国市值或估值排名前50的互联网公司中,超过80%的公司长期使用Apache Doris,包括百度、美团、小米、京东、字节跳动、腾讯、网易、桂花、微博、柯控股等。它还广泛应用于一些传统行业,如金融、能源、制造和电信。
二、常用的业务场景
如下图所示,经过各种数据集成和处理后,数据源通常存储在实时数据仓库Doris和离线Data Lake或数据仓库(在Apache Hive、Apache Iceberg或Apache Hudi中)中。
Apache Doris广泛应用于以下场景:
- 报告分析
a:实时指示板;
b: 给内部分析师和经理的报告;
c:面向用户或面向客户的高并发报表分析。
例如面向网站所有者的网站分析、面向广告主的广告报表等场景,并发通常需要数千个QPS,查询延迟需要亚秒级响应。著名电商京东在广告报表中使用Doris,每天写100亿行数据,并发查询QPS上万,查询延迟为第99百分位的150ms。
- 特别查询。
面向分析人员的自助分析,具有不规则的查询模式和高吞吐量需求。小米基于Doris构建了一个增长分析平台(growth analytics, GA),使用用户行为数据进行业务增长分析,平均查询延迟为10秒,95%查询延迟为30秒或更短,每天有数万个SQL查询。
- 统一数据仓库建设。
一个满足统一数据仓库建设需求的平台,简化了复杂的数据软件栈。海底捞基于doris的统一数据仓库取代了原有的Apache Spark、Apache Hive、Apache Kudu、Apache HBase、Apache Phoenix的架构,极大地简化了架构。
- Data Lake查询。
通过使用外部表联合位于Apache Hive、Apache Iceberg和Apache Hudi中的数据,查询性能得到了极大提高,同时避免了数据复制。
三、Doris技术概述
Apache Doris的整体架构如下图所示。Doris体系结构非常简单,只有两种类型的流程。
前端(FE): 主要负责用户请求访问、查询解析与规划、元数据管理、节点管理等相关工作。
后端(BE): 主要负责数据的存储和查询计划的执行。
这两种类型的进程都是水平可扩展的,单个集群可以支持多达数百台机器和数十拍字节的存储容量。这两类流程通过一致性协议保证了服务的高可用性和数据的高可靠性。这种高度集成的体系结构设计大大降低了分布式系统的操作和维护成本。
Apache Doris采用MySQL协议,与MySQL方言高度兼容,支持标准SQL。用户可以通过各种客户端工具访问Doris,并支持与BI工具的无缝连接。在存储引擎方面,Doris采用柱状存储,对数据,按列进行编码、压缩和读取,压缩比非常高,同时减少了大量不相关数据的扫描,从而更有效地利用IO和CPU资源。Doris还支持相对丰富的索引结构,以减少数据扫描:
- 支持排序复合键索引:最多可以指定三列来形成复合排序键。使用这个索引,可以有效地处理数据,以更好地支持高并发报告场景。
- Z-order索引:使用Z-order索引,您可以高效地对模式中的任何字段组合运行范围查询。
- MIN/MAX索引:有效过滤数值类型的等价和范围查询
- BloomFilter:对高基数列的等价过滤和修剪非常有效
- 反转索引:它支持对任何字段的快速搜索
在存储模型方面,Doris支持多种存储模型,针对不同场景进行了特定的优化:
1. 聚合键模型:通过提前聚合来合并具有相同键值的列,从而显著提高性能。
2. 唯一密钥模型:密钥是唯一的。具有相同键的数据将被覆盖,以实现行级数据更新。
3. 复制键模型:详细的数据模型可以满足事实表的详细存储。
Doris还支持强一致的物化视图,其中物化视图的更新和选择是在系统内自动进行的,不需要用户手动选择,因此显著降低了物化视图维护的成本。
查询引擎方面,Doris采用MPP模型,节点间和节点内并行执行,支持多个大型表的分布式shuffle join,能够更好地应对复杂查询。
Doris查询引擎是向量化的,所有内存结构都可以以柱状格式布局,以显著减少虚拟函数调用、提高缓存命中率和有效使用SIMD指令。宽表聚合场景中的性能比非向量化引擎高出5-10倍。
Apache Doris使用了Adaptive Query Execution技术,该技术可以根据运行时统计动态调整执行计划,如运行时过滤器技术,生成过滤器在运行时推送到探测端,并自动穿透过滤器到探测端,这大大减少了探测中的数据量,加快了连接性能。Doris的运行时过滤器支持In/Min/Max/Bloom过滤器。
在优化器方面,Doris使用了CBO和RBO的组合,RBO支持常量折叠、子查询重写、谓词下推等,而CBO支持Join Reorder。CBO仍在不断优化中,主要是更准确的统计信息收集和推导,更准确的成本模型预测等。
程序员冈刀,目前就职于美团,java开发工程师,研究生。2022年,毕业于北京邮电大学电子工程学院、电子与通信工程专业。个人公众号《代码废柴》欢迎关注。