震惊!!!数据倾斜满分回答模板来了【大厂面试必问】

面试官常问问题:

你知道数据倾斜是什么吗?

你知道如何判断任务是否发生数据倾斜吗?

你知道如何定位数据倾斜吗?

你知道如何优化数据倾斜吗?

我相信你一定遇到过上述问题,可能一个甚至多个,不管面试官问你其中一个还是多个,你都可以按照我接下来的模板来进行回答。【文末有回答模板~】

下面一篇文章教会你如何理解并且回答好这些问题

1.数据倾斜是什么

  • 在进行shuffle的时候,必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或join等操作。此时如果某个key对应的数据量特别大的话,就会发生数据倾斜

2.如何判断任务是否发生数据倾斜

  • 利用SparkUI平台,查看每个stage的执行时长,如果绝大多数stage耗时少,但个别stage耗时长甚至一直卡在那里,这就说明任务发生了数据倾斜

3.如何定位数据倾斜

  • 前提:数据倾斜只会发生在shuffle过程中,通常发生在join、groupby等
  • 同样利用SparkUI平台,查看DAG执行图,搜索执行时长最长的stage id对应的代码,即为数据倾斜代码

4.如何优化数据倾斜

4.1 map端

  • 选择可切分的压缩算法【注意:lzo压缩文件是可切片的,但是它的可切片特性依赖于其索引,所以需要手动为lzo压缩文件创建索引】
  • 让每个数据文件大小基本一致
  • 过滤异常数据:空值,无效数据

4.2 reduce端

4.2.1 消除shuffle

  • map端join:适用场景:大表join小表【10M】【不适用于大表join大表,如果广播的数据很大,可能内存溢出】对较小的RDD创建一个广播变量【数据压缩、高效的通信框架Netty、BT协议】,广播给所有的executor节点,然后利用map算子实现来进行join即可

4.2.2 增大reduce并行度

  • 计算公式:hashCode(key)%reduce个数
  • 优点:实现十分简单;缺点:可能缓解数据倾斜,不一定有效果

4.2.3 加盐

  • 方法1:两阶段聚合(局部聚合+全局聚合)
  • 没有固定适应场景
  • 实现思路:第一次是局部聚合,先给每个key都打上一个随机数,比如10以内的随机数,此时原先一样的key就变成不一样的了,比如(java, 1) (java, 1) (java, 1) (java, 1),就会变成(1_java, 1) (1_java, 1) (2_java, 1) (2_java, 1)。接着对打上随机数后的数据,进行局部聚合,那么局部聚合结果,就会变成了(1_java, 2) (2_java, 2)。然后将各个key的前缀给去掉,就会变成(java,2)(java,2),再次进行全局聚合操作,就可以得到最终结果(java, 4)。
  • 实现原理:将原本相同的key通过附加随机前缀的方式,变成多个不同的key,就可以让原本被一个task处理的数据分散到多个task上去做局部聚合,进而解决单个task处理数据量过多的问题。接着去除掉随机前缀,再次进行全局聚合,就可以得到最终的结果。
  • 方法2:采样倾斜key并分拆join操作
  • 适用场景:join的时候发生数据倾斜,经检测是由少数key的数据量大造成的
  • 实现原理:为数据量特别大的key增加随机前缀或后缀,使得这些key分散到不同的task中;那么此时数据倾斜的key变了,如何join呢?于是我想到了将另外一份对应相同key的数据与随机前缀或者后缀作笛卡尔积,保证两个表可以join
  • 方法3:使用随机前缀和扩容RDD进行join
  • 适用场景:如果出现数据倾斜的key比较多,无法将这些倾斜拆分出来
  • 实现原理:大表加盐,小表扩容【扩容就是将该表和前缀作笛卡尔积】

5.回答模板

  • 举个例子,面试官问你知道如何优化数据倾斜吗
  • 回答:我知道,我讲一下我解决这类问题的整体思路吧,首先我会去判断问题是不是数据倾斜,查看sparkUI...,然后就去定位数据倾斜的代码块,...,最后就是选择一些合适的优化方法来优化代码,比如...

这样回答,面试官一定会觉得你的思维逻辑非常清晰并且会认为你曾经解决过真实数据倾斜的案例【加分】

#数据人的面试交流地##大数据开发面经##牛客解忧铺#
全部评论

相关推荐

6 59 评论
分享
牛客网
牛客企业服务