高级使用指南
表结构变更
使用ALTER TABLE 命令可以修改表的Schema,包括如下修改:
- 增加列
- 删除列
- 修改列类型
- 改变列顺序
新增一列uv,类型为BIGINT,聚合类型为SUM,默认值为0:
ALTER TABLE table1 ADD COLUMN uv BIGINT SUM DEFAULT '0' after pv;
提交成功后,可以通过以下命令查看作业进度:
SHOW ALTER TABLE COLUMN;
当作业状态为FINISHED,则表示作业完成.
可以使用以下命令取消当前正在执行的作业:
CANCEL ALTER TABLE COLUMN FROM table1
Rollup
Rollup可以理解为Table的一个物化索引结构.物化是因为其结构在物理上独立存储,而索引的意思是,Rollup可以调整列顺序以增加前缀索引的命中率,也可以减少key列以增加数据的聚合度.
原表table1的Schema如下:
对于table1明细数据是siteid、citycode和username三者构成一个key,从而对pv字段进行聚合;如果业务方经常看城市pv总量的需求,可以建立一个只有citycode、pv的rollup.
ALTER TABLE table1 ADD ROLLUP rollup_city(citycode, pv);
提交成功后,可以通过以下命令查看作业进度:
SHOW ALTER TABLE ROLLUP;
Rollup建立完成之后可以使用DESC table1 ALL
查看表的Rollup信息.
可以使用依稀命令取消正在执行的作业:
CANCEL ALTER TABLE ROLLUP FROM table1;
数据表的查询
内存限制
当个BE节点上默认使用不超过2GB内存.如果发现抱Memory limit exceeded
错误,一般是超过内存限制了.
如果确切发现2GB内存不能满足,可以手动设置内存参数.
显示查询内存限制:
SHOW VARIABLES LIKE "%mem_limit%"
exec_mem_limit
的单位是byte,可以通过set
命令改变exec_mem_limit
的值.
以上修改是session级别,仅在当前连接session内有效,断开重连则会变回默认值.
如果需要修改全局变量,可以这样设置:
SET GLOBAL exec_mem_limit = XXX
设置完成后,断开session重新登陆,参数将永久生效.
查询超时
当前默认查询时间设置最长为300秒,如果一个查询在300秒内没有完成,则查询会被Doris系统cancel掉.用户可以通过这个参数来定制自己应用的超时时间,实现类似wait(timeout)的阻塞方式.
查看当前超时设置:
SHOW VARIABLES LIKE "%query_timeout%";
修改超时时间到1分钟:
SET query_time = 60;
- 当前超时的检查间隔为5秒,所以小于5秒的超时不会太准确.
- 以上修改同样为session级别,可以通过SET GLOBAL修改全局有效.
Broadcast/Shuffle Join
- 系统默认实现Join方式,将小表进行条件过滤后,将其广播到大表所在的各个节点上,形成一个内存Hash表,然后流式读出大表的数据进行Hash Join.但是如果当小表过滤后的数据量无法放入内存的话,此时Join将无法完成.通常报错应该是首先造成内存超限.
- 如果遇到上述情况,建议显示指定Shuffle Join,也被称作Partitioned Join.即将小表和大表都按照Join的key进行Hash,然后进行分布式的Join.这个对内存的消耗就会分摊到集群的所有计算节点上.
- Doris回自动尝试进行Broadcast Join,如果预估小表过大则会自动切换至Shuffle Join.注意,如果此时显示指定了Broadcast Join也会自动切换至Shuffle Join.
查询重试和高可用
当部署多个FE节点时,用户可以在多个FE之上部署负载均衡层来实现Doris的高可用.
以下提供一些高可用方案:
- 第一种
自己在应用层代码进行重试和负载均衡.比如发现一个连接挂掉,就自动在其他连接上进行重试.应用层重试需要应用自己配置多个doris前端节点地址. - 第二种:
如果使用mysql jdbc connector来连接Doris,可以使用jdbc的自动重试机制. - 第三种:
- 应用可以连接到和应用部署到同一机器上的MySQL Proxy,通过配置MySQL Proxy的Failover和Load Balance功能来达到目的.