通过上篇文章GBase 8a数据分布情况及数据量查看方法-优快云博客,我们已经掌握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';
问题:查看表数据的分布情况,发现表中的所有数据都在单个节点上,完全没有用上其它数据节点的资源。
分析:这种情况通常发生在 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 调整的参数失效,重启集群后需再次设置】
在新会话中,重新创建一个验证用表user_random,表结构与users表一致。
再用 insert into user_random values(),(),(); 的方式写入数据。
查看 user_random 表的数据分布情况,发现已是均匀分布状态。
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 分片上的数据明显少于二者。
分析:这种情况通常是选择了错误的 hash 分布键,导致数据按哈希规则分布时出现倾斜。
解决:更换合适的 hash 分布键。(GBase 8a的hash分布列选取策略-优快云博客)
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 分布键的新哈希分布表中,数据变得更为均匀了。
之后删掉原表,再将新建的哈希分布表rename回去就可以啦~