PowerData

编者荐语:

来自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 BE节点下线卡住?快速排障技巧全攻略!

Doris查询报错-230?别慌,教你几招秒解!

Doris Tablet 损坏如何应对?能恢复数据吗?

Doris的Stream Load那些事儿,你踩过哪些“坑”?

如何排查 Apache Doris 中 "Failed to commit txn" 导入失败问题?

Doris的Routine Load导入指南 

数据极客圈子介绍

圈子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官方社区群

叮咚✨ “数据极客圈” 向你敞开大门,走对圈子跟对人,行业大咖 “唠” 数据,实用锦囊天天有,就缺你咯!快快关注数据极客圈,共同成长!


PowerData
1 声望2 粉丝

PowerData社区官方思否账号