
1
前言
在使用 Doris 进行表创建和分区操作时,用户可能会遇到各种错误情况。本文旨在深入剖析常见的创建表失败以及动态分区失败问题,并提供具有针对性的解决思路。

2
创建表失败
1
11
BE配置为compute节点导致失败

事件解析:如果BE配置为compute节点,它不具备存储功能,只是计算节点,因而无法完成创表操作。
解决方法:
SHOW BACKENDS查看节点类型。
be_node_role=compute,重启BE即可。
2
创建大宽表失败:分区超时

事件解析:
CREATE TABLET的消息打包后发送给BE。如果消息过大,则可能会因为RPC通信需求而失败。
解决方法:
单个创建超多的bucket的性能是很差的,比如插入数据时,哪怕只插一条记录,那么该partition的所有tablet 都要插入一个rowset, 对commit version, publish version 影响超大(每个tablet 都要写多次rocksdb)
3
因为IO繁忙导致失败
事件解析:建表时报“Failed to create partition”
create tablet cost,如日志显示下:

上面的日志就是具体的日志,整个tablet 创建花费了25.6207s, 而SaveMeta 就花了24s。SaveMeta 是rocksdb 的时间,当时是IO繁忙了。
sync_tablet_meta:存储引擎是否开 sync 保留到磁盘上。默认值:true(2.1.4及之后的默认值是false了)。如果在有导入任务时候断电,这时候有些导入任务没完成,没有及时下刷,还在内存中,所以就导致数据丢失,出现tablet损坏的问题,这就是常见的断电导致tablet损坏的问题,这里其实有个参数可以避免,不过会降低性能。所以需要评估是否开启。
解决方法:
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
解决方案
3
创建动态分区失败
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
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]
解决方法:
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
解决办法
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 大致就可以确定了。
解决方案
1. 不要对同一个表的同一个分区进行并发 insert overwrite,否则只能一个操作成功,其余均失败。
4
总结
在 Doris 的应用场景中,创建表和动态分区操作虽基础却复杂,容易受到多种因素的影响而出现问题。针对这些问题,我们提出了相应的解决方案。但是上述内容可能并不能包含所有可能的情况。所以建议用户持续关注 Doris 的官方文档和社区论坛,及时获取最新的技术资讯和解决方案,从而更好地应对各类潜在问题。

往期推荐
完
Apache Doris社区是目前国内最活跃的开源社区(之一)。Apache Doris(Apache 顶级项目) 聚集了世界全国各地的用户与开发人员,致力于打造一个内容完整、持续成长的互联网开发者学习生态圈!
如果您对Apache Doris感兴趣,可以通过以下入口访问官方网站、社区论坛、GitHub和dev邮件组:
PowerData是由一群数据从业人员,因为热爱凝聚在一起,以开源精神为基础,组成的数据开源社区。
社区群内会定期组织模拟面试、线上分享、行业研讨、线下Meetup、城市聚会、求职内推等活动,同时在社区群内你可以进行技术讨论、问题请教,结识更多志同道合的数据朋友。
社区整理了一份每日一题汇总及社区分享PPT,内容涵盖大数据组件、编程语言、数据结构与算法、企业真实面试题等各个领域,帮助您提升自我,成功上岸。
可以加作者微信(Faith_xzc)直接进PowrData官方社区群
叮咚✨ “数据极客圈” 向你敞开大门,走对圈子跟对人,行业大咖 “唠” 数据,实用锦囊天天有,就缺你咯!快快关注数据极客圈,共同成长!

点击上方公众号关注我们




