【高手问答汇总】——聊聊 Apache Doris 的性能优化实战技巧

语言: CN / TW / HK

随着 Apache Doris 在越来越多的企业中得到落地和应用,越来越多用户开始关注如何在海量数据下对Doris的查询性能进行优化。有哪些性能优化的小技巧?如何降低查询耗时?数据模型和分区分桶策略该如何设计?针对慢查询该如何进行分析及优化?

OSCHINA 本期高手问答 1月18日-1月24日,来自百度的资深研发工程师、Apache Doris PPMC 缪翎,与大家一起探讨 Apache Doris 性能优化实战技巧,包括但不限于:

  • 慢查询定位、Profile 解读及SQL优化;
  • 数据模型、索引及分区分桶策略设计;
  • 物化视图及Rollup使用技巧;
  • Doris查询优化器解读;

嘉宾介绍

缪翎,百度资深研发工程师、Apache Doris PPMC,专注于 Apache Doris 查询引擎的设计和研发,在数据库查询引擎、查询优化器方向有丰富的研究和实践经验。

 


问答汇总

问:请教一个具体场景的问题,在 Apache Doris 中,如果表按天分区,每天大约 2000 至 3000 万数据量,通常按照业务字段查询最近 30 天的明细信息。如何设计能支持更多的并发查询呢?

答:如果是明细查询,建议利用前缀索引、分桶分区裁剪以及 Bitmap 索引这类的优化策略。

 

问:进一步了解下,如果是 Uniq 数据模型,在查询的过程中存在对数据的 update 操作,那么对查询会有哪些影响呢?

答:update 操作可以,如果 update 的操作频率和导入占比很小,就不会对查询有影响。

 

问:

1. 开源 Doris 和 Clickhouse 之间的优势和劣势是什么?

2. Doris 在多线程设计上,有没有使用什么设计模式?

3. Doris 入门门槛高吗?超过多大的数据量比较合适使用 Doris ?哪些场景下特别适合doris数据库的发挥优势?哪些场景下 Doris 的性能不好?

答:Doris 是 MPP 架构的数据库,这点是和 Clickhouse 从架构上有本质的不同。Doris 在 多表 Join 和分布式管理上更有优势,Clickhouse 单机性能突出。不过我们的向量化引擎也马上就能和大家见面了,性能上可以期待一下。

Doris 入门门槛不高,G-TB的数据量都适合使用。Doris 因为没有其他依赖,所以运维会方便一些。 场景方面,当然是面向分析的 OLAP 场景。OLTP 场景,比如 qps 上万的点查这类以及频繁的 update/delete的场景并不适合 Doris。

 

问: Doris 集群 不定期的出现某个 BE 节点直接挂掉的情况,每次挂掉的 BE 节点并不一样。查看监控看机器 Load 比较高(主要是磁盘IO write高)怎么排查这个问题,怎么知道这台机器上在做什么,有什么命令可以知道。

答:BE 挂掉最常见的两种情况:

1. oom 被系统 Kill,通过 dmesg 方式排查,并且结合使用方式确定 导入还是查询导致的内存使用量过大,需要优化使用方式。

2. be core 了,通过 core dump 方式找到 core 栈,core 栈就可以看到是哪部分行为导致的 BE 挂掉。并且在 Issue 里面搜索,看是否是 Doris 旧版本已知问题。每次不一样节点,那就要逐个分析,可能虽然节点不一样但原因都一样。

 

问:core dump 这个文件存放在哪里的?

答:core dump文件存放地址可以参考链接 https://www.jianshu.com/p/60a5df15093c

 

问:

1:在做 100-200 个相同 sql 并发测试时,总是越往后面的查询,尤其是做group by的时候,看 profile越慢,好像哪里卡住了似的,这个应该怎么定位是哪里的问题?

2: 通过 Broker Load 导入数据时,总偶然碰到查询超时,而且这个问题是必现,我怎么定位问题,还请给点指点。

答:

1. 这种 qps 性能分析问题,主要工具是 pprof ,看看 CPU 集中耗时在哪里。

2. 导入过程中的查询超时,建议先看监控,grafana 上的数据。比如是否导入占用了过多的 IO或者 cpu 等,导致了相互影响,再逐步根据 pprof + 代码分析。

 

问:请教下 Doris 集群规模为 6个 BE节点,在聚合模型下用天 Date做时间分区、每天数据近2亿行,发现 select max(date) 性能不佳(接近10秒),看了下执行计划发现全表扫描了,这样设计的主要考虑是什么呢?

答:确实,如果对 Range 分区字段求 Max 或者 Min 等,逻辑上可以只读最大分区数据。Doris 没对这种特殊场景做优化,所以是全表扫描。需要增加 Where 条件从而匹配到分区分桶裁剪,才能减少数据量。比如这样写 select max(date) from table where date >xxx。分区字段和索引字段需要出现在 Where 条件中效果最好。

 

问:想问一下,关于性能优化这方面,与数据类型是否有什么关联,各种数据源中的表联合查询的时候,对于复杂类型的性能优化是从哪方面着手的?

答:和数据类型关系还是很大的。比如 Int 类型的性能就会比 String 要好。复杂类型的性能优化我举个 Bitmap 的例子。Bitmap 的聚合函数在 Bitmap 分布相对稠密情况下,会比稀疏的要性能高不少。

 

问:对于聚合模型, MODIFY COLUMN 某一个已经存在的列, 从类型 BIGINT 变更为 VARCHAR , 该表按每天分区,每天数据量 1亿+,发现该表这一列历史数据过多,一直处于 SCHEMA_CHANGE【 state is not NORMAL】 状态 (大概5小时),导致后续其他的增加列,增加动态分区都不断失败重试,直到表恢复 NORMAL 状态才成功。这种情况有什么建议吗

答:同一时间单个表只能做一个 schema change 操作。所以做第一个 schema change 的时候后面增加列和增加分区的操作都被禁止了。schema change 的时间过长主要原因是表数据量大导致的。对于这种大表的表结构变更最好是等到业务不太忙的时候,比如半夜。再者,如果需要多次 schema change 建议合并为一次。

 

问:doris 后续会添加对复杂类型 Array、Map、Struct 的支持吗?Doris On ES 这个拓展功能后期会进一步优化吗?

答:会支持,目前正在开发 Array 、后面还会增加对 List / Map 等复杂类型的支持。Doris On ES 后续也会有优化,例如聚合下推、读写统一、分区裁剪等。

 

问:2021 的 Roadmap 提到会落地向量化引擎,具体什么时间能发行呢,向量化引擎和目前查询相比,查询效率大概能提升多少倍呢?

答:可以看下之前发布文章 https://my.oschina.net/u/4021972/blog/5393281

这个月底或下月初就会发布新版向量化执行引擎

 

问:多表关联的物化视图有计划吗?

答:有计划,可以关注下我们在 GitHub 上发布的 2022 年 RoadMap https://github.com/apache/incubator-doris/issues/7502

 

问:请问高吞吐量的即席查询实时性如何,比如1张1亿条数据的表,查出200万条数据,大约需要多少毫秒?

答:这个差异可能会非常大,需要结合建表语句、查询 SQL 、机器配置、集群规模等多方面因素综合来看。在 Doris 官网上基于 Star-Schema-Benchmark 标准测试数据集做过性能测试,可以参考一下 https://doris.apache.org/zh-CN/benchmark/star-schema-benchmark.html#

 

问:后续会有 GO 语言版吗?

答:目前 Doris 还只支持 Java(FE)和 C++(BE)开发,暂时没有GO语言版的计划。

 

问:Doris 现在是否支持修改列的名称?

答:目前不支持修改列名,可以看下官网上的 FAQ-11  https://doris.apache.org/zh-CN/faq/faq.html

因为一些历史原因,目前列名称是直接写入到数据文件中的。Doris 在查询时,也是通过类名查找到对应的列的。所以修改列名不仅是简单的元数据修改,还会涉及到数据的重写,是一个非常重的操作。后续可能通过一些兼容手段来支持轻量化的列名修改操作。

 

问:您好,想要咨询一下关于物联网时序数据这种场景下是否适合?

答:之前也有社区用户使用 Doris 应用在时序场景的,主要瓶颈在写入频率,不建议特别高频的写入。

 

问:接口性能优化都有哪些好的方案

答:首先要看你的情况是提升 QPS 还是提升单个慢查询。

先说慢查询:

1. 打开 Profile 观察慢查询主要的性能瓶

2. 梳理 Doris 的常见优化,比如 Join Reorder 、Runtime Filter、谓词下推等等需要手动开启的优化策略,并观察作用。

3. 从数据模型入手,比如是否存在数据版本过多、数据模型和列类型设计不合理等等问题。

 

问:Doris 有没有配置参数说明文档以及一些性能优化方面的调参建议。譬如影响数据导入,查询,合并参数指导,方便小白入门

答:最直观的就是官方文档,详细的话可以期待一下即将出版的书 ~

 

问:请问 String 类型在使用上存在 Bug ,后续有在完善吗,预计哪个版本会比较稳定呢?

答:String 是今年新加入的功能,在功能和性能方面还在改善中。今年上半年会持续对 String 进行优化,如果有 String 方面的使用问题,欢迎给 Apache Doris 开发者邮件组发邮件:[email protected]

 

问:对于 Doris 的编码质量,后续有没有策略或者计划,提升产品质量?

答:开源 Doris 目前在快速迭代中,为了保证稳定性,我们正在准备将测试框架开源给社区。

 

问:如果需要把 MySQL、Elastic Search 这种数据批量导入到 Doris ,有没有推荐的工具使用?用什么方式比较好迁移数据到 Doirs 使用?

答:MySQL 可以存量用csv + stream load,增量用 Binlog Load 功能,可参考文档:

https://doris.apache.org/zh-CN/administrator-guide/load-data/binlog-load-manual.html

ES 的话 Doris 本身就支持直接读取 ES 外表,并不一定非要导入 Doris。

 

问:关于 BE 源码调试有没有什么好的建议,如果用 Mac 或 Windows 操作系统的电脑,一般怎么进行调试?

答:如果是 Mac 或者 Windows 电脑的话,需要借用 Docker,在 Docker 里面启动 BE 并且 gdb 调试。

 

问:Doris扩容方便么?节点有无状态?

答:节点分为 FE 和 BE 两类, FE 节点是管控节点、BE 是计算和存储节点,扩容比较简单,往往只需要扩展 BE 节点即可,支持在线扩缩容,扩容期间正常查询不受影响。

 

问:Doris 和 Elastic Search 区别在哪里?还有对于企业想从 ES 切换到这个,有什么成本或者值得注意的地方,谢谢。

答:Doris 跟 ES 稍微有些差异,Doris 是 MPP 数据库,ES 是搜索引擎。Doris 的 SQL 更加友好、支持标准 SQL ,分布式比 ES 更完备。而全文检索、任意列更新、分词等 ES 特性目前 Doris 还不支持。如果同时在使用 Doris 和 ES 的话,可以考虑 Doris On ES 方案。

 

问:请问 Doris 有没有计划增加一个"自增函数"?或者是目前的 sequence 特性(

https://doris.apache.org/zh-CN/administrator-guide/load-data/sequence-column-manual.html大体也能达到自增列的效果,但它仅限 Uniq 数据模型, 有没有计划将其推广到非聚合类型的列上去,比如 Aggregate 表的 Key 列、 Duplicate 表的任意列?

答:目前自增列仅限 Uniq 表,后续计划可以到我们的 2022 Roadmap 中提出,我们会评估可行性的。Https://github.com/apache/incubator-doris/issues/7502

 

问:我们最近在做响应治理:不同维度的查询会对性能有不同的影响,比如 1 亿数据的场景下,数据权限的条件每个人都不一样,很多数据无法提前预聚合,此时 IO 会成为高性能的最大瓶颈,请问 Doris 在这方面有什么比较好的实践?

答:建议使用明细模型 + 物化视图的方式,保留明细的同时,也能有预聚合的数据,而且目前 Doris 的物化视图是可以保证基础表与物化视图表数据的强一致性。

 

问:老师能不能出一些 Doris 数据库的源码分析文章,如果想从事数据库方面的开发,需要学习哪些内容,希望能推荐一些书籍

答:分析源码的话可以去看下我们上传在B站的视频,可以关注 ApacheDoris 官方微信公众号下载课件。

书籍的话推荐以下两本:《Designing Data-Intensive Applications》(中文版叫数据密集型应用系统设计,建议看英文版)和《Architecture of a Database System》

 

问:请教一下分桶的优化技巧

答:数据分桶主要是为了分桶裁剪,并且避免数据倾斜。所以首先,最好选用像 id,uuid 这种不容易产生数据倾斜,且分散广的列作为分桶列。同时可以选择查询的 Where 条件列作为分桶列,来更好的减少读取的数据量,提升查询性能。

 

问:MySQL 业务库是分表的,如何通过 Binlog Load 把 MySQL 多表数据实时同步到 Doris 中一张表,对于这种场景有什么建议么?

答:目前 Binlog Load 还不支持多张 MySQL 表同步到一张 Doris 表,后续这块我们会优化。

 

问:目前是否支持部分列更新的功能?

答:目前部分列更新比较局限,只支持在 Agg 模型上对 Value 列进行 replace_if_not_null 的值替换。

 

问:目前我们已经在使用doris,所以很希望知道 Doris 后续的一些计划和时间节点,我们好安排自己的计划。

总体开发计划我们发布在GitHub上了,欢迎关注。最近有两个重要的时间点:

  1. 1月底或2月初,我们会发布 Apache Doris 1.0 版本的 beta 版本,主要包含完整的向量化执行引擎、Manager 可视化运维平台、Hive 外表、Lateral View、SeaTunnel Connector 等功能,正式 Release 应该在2月。
  2. 3月份我们将会支持 Array 数组类型、基于对象存储的冷热数据分离、内存管理优化、Iceberg集成等功能。

高手问答栏目查看:主题 高手问答 - OSCHINA - 中文开源技术交流社区