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

面试官常问问题:

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

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

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

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

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

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

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...,然后就去定位数据倾斜的代码块,...,最后就是选择一些合适的优化方法来优化代码,比如...

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

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

相关推荐

老粉都知道小猪猪我很久没更新了,因为秋招非常非常不顺利,emo了三个月了,接下来说一下我的情况吧本人是双非本 专业是完全不着计算机边的非科班,比较有优势的是有两段大厂实习,美团和字节。秋招面了50+场泡池子泡死的:滴滴 快手 去哪儿 小鹏汽车 不知名的一两个小厂其中字节13场 两次3面挂 两次2面挂 一次一面挂其中有2场面试题没写出来,其他的都是全a,但该挂还是挂,第三次三面才面进去字节,秋招加暑期总共面了22次字节,在字节的面评可以出成书了快手面了8场,2次实习的,通过了但没去,一次2面挂 最后一次到录用评估 至今无消息滴滴三面完 没几天挂了 所有技术面找不出2个问题是我回答不上来的,三面还来说我去过字节,应该不会考虑滴滴吧,直接给我干傻了去哪儿一天速通 至今无消息小鹏汽车hr 至今无消息美团2面挂 然后不捞我了,三个志愿全部结束,估计被卡学历了虾皮二面挂 这个是我菜,面试官太牛逼了拼多多二面挂 3道题也全写了 也没问题是回答不出来的 泡一周后挂腾讯面了5次 一次2面挂 三次一面挂,我宣布腾讯是世界上最难进的互联网公司然后还有一些零零散散的中小厂,但是数量比较少,约面大多数都是大厂。整体的战况非常惨烈,面试机会少,就算面过了也需要和各路神仙横向对比,很多次我都是那个被比下去的人,不过这也正常,毕竟谁会放着一个985的硕士不招,反而去招一个双非读化学的小子感觉现在互联网对学历的要求越来越高了,不仅仅要985还要硕士了,双非几乎没啥生存空间了,我感觉未来几年双非想要进大厂开发的难度应该直线上升了,唯一的打法还是从大二刷实习,然后苟个转正,不然要是去秋招大概率是炮灰。而且就我面字节这么多次,已经开始问很多ai的东西了,你一破本科生要是没实习没科研懂什么ai啊,纯纯白给了
不知名牛友_:爸爸
秋招你被哪家公司挂了?
点赞 评论 收藏
分享
评论
10
70
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务