编者荐语:
来自PowerData-徐振超同学的文章
以下文章来源于数据极客圈 ,作者徐振超
[
数据极客圈 .
一入大数据深似海?别怕!“数据极客圈” 就是你的救生圈,走对圈子跟对人,趣析数据、畅聊趋势,快进圈子!
](#)
1
前言
在使用 Doris 进行表创建和分区操作时,用户可能会遇到各种错误情况。本文旨在深入剖析常见的创建表失败以及动态分区失败问题,并提供具有针对性的解决思路。
2
创建表失败
1
11
BE配置为compute节点导致失败
事件解析:如果BE配置为compute节点,它不具备存储功能,只是计算节点,因而无法完成创表操作。
解决方法:
1. 通过命令SHOW BACKENDS
查看节点类型。
2. 如果配置为compute,删除BE配置文件中的be_node_role=compute
,重启BE即可。
2
创建大宽表失败:分区超时
事件解析:
建表时,FE会将一些CREATE TABLET
的消息打包后发送给BE。如果消息过大,则可能会因为RPC通信需求而失败。
FE发送的消息大小与下列因素相关: “单分区的bucket数 * 表中的列数 / BE节点数”。对宽表,column 数很多,且每个column序列化后都很大,所以会造成thift rpc 消息过大,容易把发给be的socket塞满报错。
解决方法:
1. 降低单个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损坏的问题,这里其实有个参数可以避免,不过会降低性能。所以需要评估是否开启。
解决方法:
1. 修改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
解决方案
1. 可以将将allow\_replica\_on\_same\_host = true规避
2. 一个机器上不推荐部署多个be节点
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"
解决方法:
1. 通过SHOW DYNAMIC PARTITION TABLES
查看表中的start值,将负值过大的值修正为合适范围内。
2. 升级到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]
解决方法:
1.临时解决办法:手动创建分区
2.升级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
解决办法
1. 把表的colocate\_with 属性去掉, 才能建分区成功;
2. 手工alter table add partition, 显式指定partition 的bucket数
3. 后续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 大致就可以确定了。
解决方案
1. 不要对同一个表的同一个分区进行并发 insert overwrite,否则只能一个操作成功,其余均失败。
4
总结
在 Doris 的应用场景中,创建表和动态分区操作虽基础却复杂,容易受到多种因素的影响而出现问题。针对这些问题,我们提出了相应的解决方案。但是上述内容可能并不能包含所有可能的情况。所以建议用户持续关注 Doris 的官方文档和社区论坛,及时获取最新的技术资讯和解决方案,从而更好地应对各类潜在问题。
往期推荐
[
](http://mp.weixin.qq.com/s?__b...
Doris的Stream Load那些事儿,你踩过哪些“坑”?
如何排查 Apache Doris 中 "Failed to commit txn" 导入失败问题?
完
●
数据极客圈子介绍
●
圈子1
Apache Doris社区是目前国内最活跃的开源社区(之一)。Apache Doris(Apache 顶级项目) 聚集了世界全国各地的用户与开发人员,致力于打造一个内容完整、持续成长的互联网开发者学习生态圈!
如果您对Apache Doris感兴趣,可以通过以下入口访问官方网站、社区论坛、GitHub和dev邮件组:
💡官网文档:https://doris.apache.org
💡社区论坛:https://ask.selectdb.com
💡GitHub:https://github.com/apache/doris
💡dev邮件组:mailto:dev@doris.apache.org
可以加作者微信(Faith\_xzc)直接进Doris官方社区群
圈子2
PowerData是由一群数据从业人员,因为热爱凝聚在一起,以开源精神为基础,组成的数据开源社区。
社区整理了一份每日一题汇总及社区分享PPT,内容涵盖大数据组件、编程语言、数据结构与算法、企业真实面试题等各个领域,帮助您提升自我,成功上岸。
可以加作者微信(Faith\_xzc)直接进PowrData官方社区群
叮咚✨ “数据极客圈” 向你敞开大门,走对圈子跟对人,行业大咖 “唠” 数据,实用锦囊天天有,就缺你咯!快快关注数据极客圈,共同成长!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。