Doris性能优化实战技巧

为什么选择Doris

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

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

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

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

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

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

操作

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

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

5.Doris 现在是否支持修改列的名称?

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

6.通过 Broker Load 导入数据时,总偶然碰到查询超时,而且这个问题是必现,我怎么定位问题?

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

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

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

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

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

查询优化

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

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

9.如果是 Uniq 数据模型,在查询的过程中存在对数据的 update 操作,那么对查询会有哪些影响呢?

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

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

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

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

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

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

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

13.接口性能优化都有哪些好的方案?

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

先说慢查询:

第一,打开 Profile 观察慢查询主要的性能瓶

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

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

14.请教一下分桶的优化技巧?

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


觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭



wechat pay



alipay

Doris性能优化实战技巧
http://yuting0907.github.io/2022/08/10/Doris性能优化实战技巧/
作者
Echo Yu
发布于
2022年8月10日
许可协议