Doris 建表与分区问题全解析

前言

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

一、创建表失败

1.把BE配置为compute节点导致失败

解析:如果BE配置为compute节点,它不具备存储功能,只是计算节点,因而无法完成创表操作。

解决方法:

  1. 通过命令SHOW BACKENDS查看节点类型。
  2. 如果配置为compute,删除BE配置文件中的be_node_role=compute,重启BE即可。

2.创建大宽表(column很多)失败:分区超时

事件解析:

  • 建表时,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损坏的问题,这里其实有个参数可以避免,不过会降低性能。所以需要评估是否开启。

解决方法:

  • 修改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节点

二、创建动态分区失败

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 大致就可以确定了。

解决方案

不要对同一个表的同一个分区进行并发 insert overwrite,否则只能一个操作成功,其余均失败。

总结

在 Doris 的应用场景中,创建表和动态分区操作虽基础却复杂,容易受到多种因素的影响而出现问题。针对这些问题,我们提出了相应的解决方案。但是上述内容可能并不能包含所有可能的情况。所以建议用户持续关注 Doris 的官方文档和社区论坛,及时获取最新的技术资讯和解决方案,从而更好地应对各类潜在问题。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据极客圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值