当前位置: 首页 > news >正文

【详解】Spark数据倾斜问题由基础到深入详解-完美理解-费元星

数据倾斜定义:顾名思义,就是大量相似或相同数据聚集在一个块的节点里,导致计算和资源分配不均导致的计算缓慢(长尾)问题。

数据倾斜原因:

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))from(select 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源码详解,也有一些没解决很好的问题,例如倾斜键识别。

相关文章:

  • 使用K-means把人群分类
  • MongoDB的部署
  • 成倍提高生产力工具Notion
  • 解决ansible批量加入新IP涉及known_hosts报错的问题
  • uniapp中解决swiper高度自适应内容高度
  • 后端返回图片流前端展示图片
  • 【蓝桥杯软件赛 零基础备赛20周】第5周——高精度大数运算与队列
  • linux(3)之buildroot配置软件包
  • JavaScript中的时间日期函数new Date()(JS中5种获取时间戳的函数)
  • SELinux refpolicy详解(5)
  • 无人机助力电力设备螺母缺销智能检测识别,python基于YOLOv5开发构建电力设备螺母缺销小目标检测识别系统
  • [github全教程]github版本控制最全教学------- 大厂找工作面试必备!
  • uniapp uni-popup组件在微信小程序中滚动穿透问题
  • python获取网络时间,0延时
  • 使用Xshell启动远程服务器上的tensorboard:本地浏览器打开
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • CSS中外联样式表代表的含义
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • JAVA多线程机制解析-volatilesynchronized
  • JS字符串转数字方法总结
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • PHP那些事儿
  • QQ浏览器x5内核的兼容性问题
  • React-生命周期杂记
  • 百度小程序遇到的问题
  • 爬虫模拟登陆 SegmentFault
  • 如何在 Tornado 中实现 Middleware
  • 思否第一天
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​香农与信息论三大定律
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (C#)获取字符编码的类
  • (day6) 319. 灯泡开关
  • (WSI分类)WSI分类文献小综述 2024
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • *Django中的Ajax 纯js的书写样式1
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net 反编译_.net反编译的相关问题
  • .NET 分布式技术比较
  • .NET6实现破解Modbus poll点表配置文件
  • .net网站发布-允许更新此预编译站点
  • .NET学习全景图