1 增大内存
内存不够时, 查询可能会出现‘Memory limit exceeded’, 这是因为doris对每个用户默认设置内存限制为 2g
SHOW VARIABLES LIKE "%mem_limit%";
exec_mem_limit 的单位是 byte,可以通过 SET 命令改变 exec_mem_limit 的值。如改为 8GB。
SET exec_mem_limit = 8589934592;
上述设置仅仅在当前session有效, 如果想永久有效, 需要添加 global 参数
SET GLOBAL exec_mem_limit = 8589934592;
2 修改超时时间
doris默认最长查询时间为300s, 如果仍然未完成, 会被cancel掉
SHOW VARIABLES LIKE "%query_timeout%";
可以修改为60s
SET query_timeout = 60;
同样, 如果需要全局生效需要添加参数 global
set global query_timeout = 60;
3 Broadcast/Shuffle Join
doris在join操作的时候时候, 默认使用broadcast的方式进行join, 即将小表通过广播的方式广播到大表所在的节点, 形成内存hash, 然后流式读出大表数据进行hashjoin
但如果小表的数据量也很大的时候, 就会造成内存溢出, 此时需要通过shuffle join的方式进行, 也被称为partition join. 即将大表小表都按照join的key进行hash, 然后进行分布式join
- 使用 Broadcast Join(默认)
select sum(table1.pv) from table1 join table2 where table1.siteid = 12;
- 显示指定braodcast
select sum(table1.pv) from table1 join [broadcast] table2 where table1.siteid = 12;
- 使用suffle join
select sum(table1.pv) from table1 join [shuffle] table2 where table1.siteid = 12;
4 doris的高可用方案
当部署多个 FE 节点时,用户可以在多个fe上部署负载均衡实现或者通过mysql connect 自动重连
jdbc:mysql://[host:port],[host:port].../[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]...
或者应用可以连接到和应用部署到同一机器上的 MySQL Proxy,通过配置 MySQL Proxy 的 Failover 和 Load Balance 功能来达到目的。