写点什么

数仓发生数据倾斜不要慌,教你轻松获取表倾斜率

发布于: 2021 年 06 月 08 日

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​摘要: GaussDB(DWS)是 MPP 并行架构,若表的数据存在倾斜情况,会引起一系列性能问题,影响用户体验,严重时可能会引起系统故障。因此能快速获取倾斜的表并整改是 GaussDB(DWS)运维管理人员比较关注的事情。


本文分享自华为云社区《GaussDB(DWS)发生数据倾斜不要慌,一文教你轻松获取表倾斜率》,原文作者:SeqList  。

 

GaussDB(DWS)是 MPP 并行架构,若表的数据存在倾斜情况,会引起一系列性能问题,影响用户体验,严重时可能会引起系统故障。因此能快速获取倾斜的表并整改是 GaussDB(DWS)运维管理人员比较关注的事情。

需求描述

   

GaussDB(DWS)自身提供 pgxc_get_table_skewness 视图来查询倾斜情况,但实际实践过程中,该视图存在性能问题,且该视图的倾斜率计算有问题。实践过程中,该视图获取的某个表的倾斜率在不高的情况下(例如 0.03),但实际上该表是存在倾斜情况的。


同时在很多时候我们需要获取一个 schema 下所有表的倾斜率,以排查倾斜问题,pgxc_get_table_skewness 在产品文档中也描述是一个性能较差的视图。


因此项目实践过程中急需一个性能好且能表达倾斜情况的函数或视图。

设计思路

   

GaussDB(DWS)有获取每个 DN 的空间大小函数 table_distribution,通过该函数,我们能快速获取每个 DN 的大小,同时可以根据每个 DN 的大小,来获取表的倾斜情况:

skewness= (max(dnsize) - avg(dnsize))*100/max(dnsize)

该倾斜率公式计算表的最大 DN 空间大小与平均 DN 空间大小的占比,能准确反映倾斜率,乘 100 为表现百分比。

实现过程

   

根据倾斜公式,我们得出以下 SQL,该 SQL 能快速获取 schema 所有表的倾斜情况,下面以 public 为例:


select schemaname,tablename,sum(dnsize)/1024^3 dnsize_gb,(max(dnsize) - avg(dnsize))*100/nullif(max(dnsize),0) skewness_factorfrom (select schemaname,tablename,(regexp_split_to_array(tbl_dis,'[\,\(\)]+'))[4]::bigint as vprocname,(regexp_split_to_array(tbl_dis,'[\,\(\)]+'))[5]::bigint as dnsizefrom (select nspname as schemaname,relname as tablename,table_distribution(nspname,relname)::text as tbl_disfrom pg_class ainner join pg_namespace bon a.relnamespace = b.oidand a.relkind = 'r'and b.oid not in (100))) where schemaname= 'public' group by 1,2 order by 3 desc;
复制代码


​结果样例如下,通过例子,可以看出来,test13 这个表 2GB,且发生严重的倾斜 97%,同时 store_sales1 一个 70GB 的大表也存在倾斜情况 58%



与 GaussDB(DWS)的 pgxc_get_table_skewness 视图结果比对

  

使用 GaussDB(DWS)的系统视图 pgxc_get_table_skewness,比较难看出来 store_sales1 存在倾斜情况。


此处我们使用的是系统视图 pgxc_get_table_skewness 获取


select * from  PGXC_GET_TABLE_SKEWNESS where schemaname = 'public' and tablename in ('store_sales1','test13');
复制代码


​从结果上看,skewratio 字段,test13 表能看出来存在严重倾斜情况,而 store_sales1 的 skewratio 值只有 0.031,看不出来存在倾斜情况。但事实上该表是存在一定倾斜的



我们通过 table_skewness 看每个 DN 的数据分布验证,发现 store_sales1 的确存在一定倾斜。



总结:


GaussDB(DWS)的倾斜率获取视图 pgxc_get_table_skewness 的结果,虽能反映严重倾斜的表,但存在倾斜的大表则比较难看出来。同时该函数存在一定的性能问题,较多表的情况下基本执行不出来。


本文提供的倾斜率获取办法能比较准确反映表的倾斜情况且能叫快速获取整 schema 所有的表的倾斜率方法;该方法在测试过程中,数据量越大,表越多,执行的时间会越慢,测试一个 schema 约 3800 张表,共 40TB 左右的数据,在 5 分钟左右获取所有表的空间大小与倾斜率。


但本文提供的方法只能对单个 schema 操作,对整个数据库获取表空间大小与倾斜率,实测无法执行成功。若对时效性不要求的话,可以每天固定一个时间,已跑批的形式,获取一个库的所有表清单,使用 table_distribution 函数,一次一个表地获取表的空间信息,使用多并发执行,这样的方式能在一定时间内将所有表的空间情况执行完成。


例如:对整库有 10 万张表的情况,可以使用 100 个并发同时执行 insert into table_size_info select * fromtable_distribution('schema.table'); 这样的方式将 10 万张表的 DN 空间信息获取完成,然后使用本文的公式汇总获取每个表的倾斜率与空间总大小。


想了解 GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的 PB 级数仓黑科技,后台还可获取众多学习资料~


点击关注,第一时间了解华为云新鲜技术~

发布于: 2021 年 06 月 08 日阅读数: 126
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
数仓发生数据倾斜不要慌,教你轻松获取表倾斜率