前言
在使用 Doris 进行表创建和分区操作时,用户可能会遇到各种错误情况。本文旨在深入剖析常见的创建表失败以及动态分区失败问题,并提供具有针对性的解决思路。
一、创建表失败
1.把BE配置为compute节点导致失败
解析:如果BE配置为compute节点,它不具备存储功能,只是计算节点,因而无法完成创表操作。
解决方法:
- 通过命令
SHOW BACKENDS
查看节点类型。 - 如果配置为compute,删除BE配置文件中的
be_node_role=compute
,重启BE即可。
2.创建大宽表(column很多)失败:分区超时
事件解析:
- 建表时,FE会将一些
CREATE TABLET
的消息打包后发送给BE。如果消息过大,则可能会因为RPC通信需求而失败。 - FE发送的消息大小与下列因素相关:
“单分区的bucket数 * 表中的列数 / BE节点数”。对宽表,column 数很多,且每个column序列化后都很大,所以会造成thift rpc 消息过大,容易把发给be的socket塞满报错。
解决方法:
- 降低单个partition内的bucket数。(根据实际情况设置,推荐单个tablet大小1-10G)
单个创建超多的bucket的性能是很差的,比如插入数据时,哪怕只插一条记录,那么该partition的所有tablet 都要插入一个rowset, 对commit version, publish version 影响超大(每个tablet 都要写多次rocksdb)
3.因为IO繁忙导致失败
建表时报“Failed to create partition”
事件解析:
- 查看FE主节点日志,搜上述报错,确认有错误的BE节点ID和tablet ID。
- 然后去对应的BE节点搜
create tablet cost
,如日志显示下:
上面的日志就是具体的日志,整个tablet 创建花费了25.6207s, 而SaveMeta 就花了24s。SaveMeta 是rocksdb 的时间,当时是IO繁忙了。
sync_tablet_meta:存储引擎是否开 sync 保留到磁盘上。默认值:true(2.1.4及之后的默认值是false了)。如果在有导入任务时候断电,这时候有些导入任务没完成,没有及时下刷,还在内存中,所以就导致数据丢失,出现tablet损坏的问题,这就是常见的断电导致tablet损坏的问题,这里其实有个参数可以避免,不过会降低性能。所以需要评估是否开启。
解决方法:
- 修改BE配置sync_tablet_meta=false,减少IO写入压力。
4.建表报错Failed to find enough backend
报错示例:
'errCode = 2, detailMessage = errCode = 2, detailMessage = Failed to find enough backend, please check the replication num,replication tag and storage medium and avail capacity of backends.\nCreate failed replications:\nreplication tag: {"location" : "default"}, replication num: 1, storage medium: HDD'
先检查下是不是同一个host机器上部署了多个be,若是将allow_replica_on_same_host = true
解决方案
- 可以将将allow_replica_on_same_host = true规避
- 一个机器上不推荐部署多个be节点
二、创建动态分区失败
1.动态分区“start值过大”
解析:如果start的绝对值过大,且不等于-2147483648
(表示int最小值),则分区将不会正常生成。
报错信息示例:
"461 WARN (DynamicPartitionScheduler|53) [DynamicPartitionScheduler.getDropPartitionClause():440] Error in gen reservePartitionKeyRange. Error=errCode = 2, detailMessage = date literal [+271768-09-11] is invalid: Text '+271768-09-11' could not be parsed at index 1, db: default_cluster:manufacture_mart_dwd, table: dwd_bjmds_mes_immo_immodata_di"
解决方法:
- 通过
SHOW DYNAMIC PARTITION TABLES
查看表中的start值,将负值过大的值修正为合适范围内。 - 升级到2.0.12或2.1.4版本可以解决存在的区间问题。
2.alter table column之后,创建动态分区失败
报错信息示例:
210 WARN (DynamicPartitionScheduler|42) [DynamicPartitionScheduler.executeDynamicPartition():631] has error
org.apache.doris.common.DdlException: errCode = 2, detailMessage = Cannot assign hash distribution with different distribution cols. new is: [`media` INT NULL, `dsp_slot` VARCHAR(255) NULL, `pkg` VARCHAR(1024) NULL] default is: [`me
dia` INT NULL, `dsp_slo` VARCHAR(255) NULL, `pkg` VARCHAR(255) NULL]
解决方法:
- 临时解决办法:手动创建分区
- 升级2.1.7或者3.0.2及之后的版本。
3.Colocate 表创建分区失败
报错信息示例:
看下建表语句中属性中是否包含 colocate_with, 包含的就是一个colcoate 表。同一个colocate group, 要求它的所有表、所有分区具有相同的replication_allocation和buckets,即所有分区的分布是完全一样的。
//可以查看colocate group 的replica allocation 和buckets num。
show proc "/colocation_group";
Colocate 要求bucket数不一样,auto bucket是变动bucket数,两者天然互斥。建表时两个不要一起用了。
对动态分区, auto bucket 的优先级都是最高的。表指定auto bucket之后, 只要存在有数据(version > 1)的分区,动态分区是走auto bucket。 当不存在有数据的分区(所有version = 1),才会用使用dynamic_partition.bucket 或者 table.default bucket
解决办法
- 把表的colocate_with 属性去掉, 才能建分区成功;
- 手工alter table add partition, 显式指定partition 的bucket数
- 后续2.1.8和3.0.4及以后版本,auto bucket 暂时禁止使用 colocate_with。
4.Insert overwrite 报错 Failed to ADD PARTITION
报错示例:
报错:task exec failed, error msg is java.lang.RuntimeException: java.sql.SQLException: errCode = 2, detailMessage = Failed to ADD PARTITION tmp_partition_66327d2c_5cb3_4044_a786_04d8cf757db6 LIKE p20240101. Reason: errCode = 2, detailMessage = Range [types: [DATEV2]; keys: [2024-01-01]; ..types: [DATEV2]; keys: [2024-01-02]; ) is intersected with range: [types: [DATEV2]; keys: [2024-01-01]; ..types: [DATEV2]; keys: [2024-01-02]; )
确认方法:搜所有的fe audit log, 报错信息在audit log 中会出现的,查看报错的表和分区,再搜所有的audit log,是不是在差不多的时间内,对同一个表的同一个分区也执行insert overwrite了。
注,这里说的是同一个表的同一个分区,但editlog 里的SQL语句不一定会出现报错的分区名字,所以搜日志里不要带分区名字,而是看在报错前后差不多相同时间内,有对该table 执行多个insert overwrite 大致就可以确定了。
解决方案
不要对同一个表的同一个分区进行并发 insert overwrite,否则只能一个操作成功,其余均失败。
总结
在 Doris 的应用场景中,创建表和动态分区操作虽基础却复杂,容易受到多种因素的影响而出现问题。针对这些问题,我们提出了相应的解决方案。但是上述内容可能并不能包含所有可能的情况。所以建议用户持续关注 Doris 的官方文档和社区论坛,及时获取最新的技术资讯和解决方案,从而更好地应对各类潜在问题。