泉州专业网站设计技术公司,做我女朋友好不好手机网站,同城推广引流平台,老闵行是指哪里数据倾斜定义#xff1a;顾名思义#xff0c;就是大量相似或相同数据聚集在一个块的节点里#xff0c;导致计算和资源分配不均导致的计算缓慢#xff08;长尾#xff09;问题。
数据倾斜原因#xff1a;
count(distinct field)
group by
NULL 空值
Shuffle (概率最…数据倾斜定义顾名思义就是大量相似或相同数据聚集在一个块的节点里导致计算和资源分配不均导致的计算缓慢长尾问题。
数据倾斜原因
count(distinct field)
group by
NULL 空值
Shuffle (概率最高、发生最普遍的数据倾斜问题本文重点讲述这个)
###################################################
先说解决方案
1.相同值打散
各个论坛、博文写的最多的一种最好理解的对于NULL、空字符串、等可以找到的值加rand打散。
concat_ws(_,field,rand())
重点关注 concat和 concat_ws 的区别是什么面试和开发中的坑 经常遇见。
2.全局打散
主要解决的场景是大表和大表进行关联Join注意如果是小表的话直接mapjoin 采用广播即可解决。
大表和大表全局打散的思路就是对左表假设左表键倾斜进行rand打散本例举例10倍注意这里还有优化空间就是方法三对右表进行explode行转列膨胀10倍。代码实操
3.局部打散
局部打散主要解决超大的两张进行关联在公司某搜索场景下A、B表为不固定倾斜键百亿和十亿的数据计算为提升性能特封装此方法。查找倾斜键并只对倾斜键进行膨胀如果膨胀10倍注意右表是11倍的行转列。
# 伪代码不理解可以再提问
select A.window_nums,
R.uid_concat
from (select case when replierUid 0 or replierUid is null then rand()when window_nums 100000 then concat_ws(_,replierUid,cast(ceiling(rand() * 10) as int))fromselect row_number() over(partition by if(replierUid 0,rand(),replierUid) order by aid) as window_numsfrom table_a A1
) A left outer join(select *,concat_ws(_,uid, rand_num) as uid_concatfrom R lateral view explode(getGenergeCode(10)) tmp_tbl as rand_numunion allselect *,null,concat_ws(_,uid) as uid_concatfrom R
) R ON (A.touid_concat R.uid_concat) /*** 输入* author 费元星* param key 输入数值* return 返回容积为数值大小步长为1的数组* Demo : spark.udf.register(getGenergeCode, DataCenterUtils.getGenergeCode _)*/def getGenergeCode(key: Int): Array[Int] {return scala.Array.range(1, key 1, 1)}def main(args: Array[String]): Unit {for (x - getGenergeCode(10)) {print( x)}println()}/** spark.udf.register(getGenergeCode, DataCenterUtils.getGenergeCode _) */4.在局部打散基础上可以采用局部多段打散目前生产环境中还未遇到感兴趣的网友可以试试这个思路。
5.一顿操作猛如虎有没有更牛的解决方案答案有采用Spark Dce百度和英特尔联合开发的基于硬件的shuffle解决方案和负责人在内部分享会上交流过形成一个共同的结论如果能在集群底层将各种问题封装好不暴露给使用用户RD是最佳的方案。
6.当然除此之外开源也有一些解决方案AQE等后面有时间可以再出一篇AQE源码详解也有一些没解决很好的问题例如倾斜键识别。