GBase 8a MPP数据分布不均解决办法

通过上篇文章GBase 8a数据分布情况及数据量查看方法-CSDN博客,我们已经掌握GBase 8a表数据分布情况的查看方法,那当发现表数据分布不均匀时,我们将如何解决呢?

演示的 user 表结构如下:

CREATE TABLE users (
  "id" int NOT NULL DEFAULT '0',
  "name" varchar(255) NOT NULL,
  "age" int NOT NULL,
  "email" varchar(255) NOT NULL,
  "address" varchar(255) NOT NULL
);
#GBase 8a 默认创建的表为随机分布表。

演示的 user_age 表结构如下:

CREATE TABLE "user_age" (
  "id" int NOT NULL DEFAULT '0',
  "name" varchar(255) NOT NULL,
  "age" int NOT NULL,
  "email" varchar(255) NOT NULL,
  "address" varchar(255) NOT NULL
) DISTRIBUTED BY('age');
#创建以age为hash分布键的哈希分布表

1.表的所有数据都集中在单个节点上

select * from information_schema.CLUSTER_TABLE_SEGMENTS a where table_schema='test' and table_name='users';

问题:查看表数据的分布情况,发现表中的所有数据都在单个节点上,完全没有用上其它数据节点的资源。

62b843288e99479cb84787ea2c0f6351.png

分析:这种情况通常发生在 insert into table values(),(),(); 这种方式入库的数据。

解决:GBase 8a在执行 insert 命令时,默认会将写入的数据都落到当前执行 SQL 的数据节点上,而不是随机分发到各节点上。若想让 insert 的数据分发到各数据节点上,需要开启 gcluster_random_insert 这个参数。

gcluster_random_insert 是默认是关闭状态,打开后 insert 的数据会随机分发到各数据节点】

show variables like '%gcluster_random_insert%';
#查看参数状态

set global gcluster_random_insert=1;
#全局状态,开启此参数

show variables like '%gcluster_random_insert%';
#再次查看参数状态

此时可以看到参数已经是打开状态。

注意!!!set global 设置全局参数的方式,对所有在此之后开启的新会话和连接生效,当前和在此之前开启的会话不享用参数效果。请重新开启一个会话

【集群重启会让 set global 调整的参数失效,重启集群后需再次设置】

d9416aed087841f0a8f02391bc2d9a1b.png

在新会话中,重新创建一个验证用表user_random,表结构与users表一致。

再用 insert into user_random values(),(),(); 的方式写入数据。

查看 user_random 表的数据分布情况,发现已是均匀分布状态。

6a4113e4775b40df84a9270fb9ebfb92.png

PS:本方法只针对通过 insert 方式写入的数据,使用 load 方式写入的数据,若目标表是默认的随机分布表,则数据会自行随机分布。

2.HASH分布表中的数据有明显倾斜

select * from information_schema.CLUSTER_TABLE_SEGMENTS a where table_schema='test' and table_name='user_age';

问题:查看表数据的分布情况,发现表中的数据集中分布在 n1 和 n3 分片所在的节点上,而 n2 分片上的数据明显少于二者。

a5dd1df76b0f4764a4017a6275abc79b.png

分析:这种情况通常是选择了错误的 hash 分布键,导致数据按哈希规则分布时出现倾斜。

解决:更换合适的 hash 分布键。(GBase 8a的hash分布列选取策略-CSDN博客

create table user_name distributed by ('name') as select * from test.user_age;
#创建一个名为user_name的新表,指定hash分布键为name字段,并将user_age表中的数据全部写入user_name表中。

【PS:如果根据业务 SQL 选择的 hash 分布键始终出现数据倾斜的问题,则可通过多 hash 分布键的方式解决。即 distributed by ('id','name') 通过在 hash 分布键中再增加一个 distinct 值高的字段,缓解数据倾斜的情况】

可以看到,与 user_age 完全一样的数据,在以 name 为 hash 分布键的新哈希分布表中,数据变得更为均匀了。

a4d52805416d4fce9228e4081a87c3b3.png

        之后删掉原表,再将新建的哈希分布表rename回去就可以啦~

  • 32
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值