学习 : Spark数据倾斜

1 篇文章 0 订阅
1 篇文章 0 订阅

【大厂面试】大数据面试必问,Spark 数据倾斜

相关面试题 :
1.【京东】是否遇到过数据倾斜的问题,是如何解决的?
2.【淘宝】在Spark开发中做过哪些优化?
3.【美团】谈谈对广播变量的理解,如何使用,解决了什么问题?

数据倾斜

1.定义 : 数据倾斜指的是,并行处理海量数据过程中,某个或者某些分区的数据显著多余其他分区,从而使得该部分的处理速度成为整个数据集处理的瓶颈。
在这里插入图片描述

2.危害
2.1.
2.2.
2.3.

3.大数据处理步骤
在这里插入图片描述

4.为什么发生数据倾斜?/ 发生数据倾斜的原因
4.1.Map task数据倾斜
4.1.1.不可切分的压缩算法
4.1.2.数据文件大小不一致
———————————————————————————————————
4.2.Reduce task数据倾斜
4.2.1.数据中有很多空值,被分配到同一分区
4.2.2.Shuffle + Key 分布不均***(主要原因)***

5.解决办法
5.1.消除map端的数据倾斜
5.2.消除reduce端的数据倾斜
5.2.1.
过滤数据,解决异常数据带来的数据倾斜
5.2.2.
5.2.2.1.消除Shuffle
5.2.2.2.改变Reduce的并行度
5.2.2.3.加盐,给 key 添加随机数据强行打散数据

6.数据特征分析
分析数据必须先于处理数据,分析数据主要包括以下内容
6.1.数据的整体规模
数据规模有多大,文件有多少个,每个文件的大小
预估资源的开销
6.2.数据的存储格式
普通文件格式/列式存储的文件格式
文件是否压缩,压缩格式是什么
6.3.数据列值的分布
每一列有值的行数,每个值的行数分布(特别是key相关的列)
分析列值分布可以通过数据采样完成
数据倾斜处理依赖这一步额数据列值分布结果

7.数据倾斜判定条件
7.1.外在表象:
7.1.1.Executor lost,OOM,Shuffle过程频繁出现错误信息
7.1.2.单个Executor执行时间特别久,整体任务卡在某个阶段不能结束
7.1.3.正常运行的任务突然失败,大多数Task运行正常,个别Task运行缓慢或发生OOM

7.2.最根本的原因:
个别task处理的数据量远多于其他task,
每个task拥有的资源是相同的,
处理大数据量的task的所需的时间自然远多于其他的task

8. 如何定位数据倾斜
8.1.借助Spark Web UI
8.2.定位Shuffle算子 在这里插入图片描述
在这里插入图片描述

9.解决方案
9.1.消除map端的数据倾斜
数据源可能会带来map端的数据倾斜,
产生的原因: 文件采用了不支持splittable的压缩算法&文件大小不一致
在这里插入图片描述
Tips : 压缩算法表【是否支持切分】在这里插入图片描述
解决方案 :
1.让输入端文件的压缩算法支持切分
2.如果压缩算法实在是不支持切分,考虑每个文件大小基本相同
3.??增加数据预处理??

9.2.过滤异常数据
对Key进行的数据特征分析,可以发现是否有异常数据:
null(空值)或是一些无意义的信息之类的,大多是这个原因引起
无效数据,对结果影响不大的有效数据或是大量重复的测试数据【如 : 新注册的视频网站账号,视频网站会随机推送当前的热门影片,类似这些数据】
正常数据,业务导致的数据发呢不
对于1,2两种情况,对数据进行预处理,过滤即可
例 :
df.select(“key”).sample(false,0.1) // 不放回取样
.map(k => (k,1))
.reduceByKey(_ + _) // 计算key出现的次数
.map(k => (k._2,k._1)) // 交换 key 和 value
.sortByKey(false) // 按照key倒序排序
.take(10) // 取出前10

为什么Key分布不均匀
对于给定的数据,如果预先对数据特征进行分析,有可能发现产生数据倾斜的key。显示生产环境中哪些场景下key可能会倾斜?
1.填充默认值
如 : 某些信息获取不到时被填充了默认值;或在请求不到广告时播放默认广告
2.业务本身存在热点
特价商品的广告曝光量显著大于其他广告
热销商品的广告曝光量显著大于其他商品
开屏广告曝光量/点击量显著大于其他广告
一二线城市的活跃用户量明显大于其他城市

3.存在恶意数据
网络爬虫使用同一个ID刷了海量广告

9.3.Map side join
正常执行join操作时,要对数据进行分区,不可避免的带来shuffle;
如果是大表和小表做关联,可采用map side join,彻底的消除shuffle,进而规避数据倾斜;(小表的标准 : 10M ,可调节,小表声明成广播变量,广播变量分块的缺省值 : 4M,缺省情况下 Driver 的内存为 1G)
在这里插入图片描述
在这里插入图片描述
案例 :
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
9.3.改变 Reduce 的并行度
调整并行度 : 改变了 Shuffle 过程中数据的去向
在这里插入图片描述
优点 : 简单
缺点 : 不确定并行度调整成什么比较合适
在这里插入图片描述
9.5.加盐
在这里插入图片描述
9.6.加盐打散 key
在这里插入图片描述
在这里插入图片描述
9.6.大表加盐,小表扩容
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值