Spark面试高频真题二--数据倾斜

〇、前言

Spark是业界常用的大规模分布式数据处理引擎,也是数仓开发最常用的工具组件,通常一二三轮面试官都会或多或少的提问相关的基础问题。

数据倾斜是数仓面试必问题,属于数据开发基本功,但从发现、定位、处理、预防全面准确的回答才能让面试官感受到深度的思考,体现出候选人对于组件原理与应用的专业性。下面是总结的数据倾斜相关的面试问题和答案参考。

一、数据倾斜

1.数据倾斜现象

一般有两种现象基本可以断定是发生了数据倾斜。一是大部分task都完成的非常快,但是个别task用时非常长。例如总共1000个task,990个都在分钟内完成;但是剩余10个都需要一个小时以上,那么可以断定发生了数据倾斜。二是一直运行正常的任务,突然某一天发生了OOM。大概率也是出现了异常热点key导致数据倾斜。

图片

2.数据倾斜原理

Shuffle过程中map节点的所有数据会根据每行数据的key值分发到不同的reduce节点,如果这时候key值分布不均衡,就会导致少量热点key值的task数据传输开销过大。例如大多数key值数据只有10条,但是少部分key值有100w条;那么计算10条key值的task会在几秒内完成,但是100w条key值的task可能会需要一个小时,最终spark任务的完成时间是一个小时,被耗时最长的task整体拖慢。

因此数据倾斜出现时,spark任务看起来会很慢,甚至让负载较多的task内存溢出导致spark任务失败。

3.数据倾斜定位

spark自带web ui,可以用于监控任务运行的状态。当判断可能是数据倾斜问题时,可以先查看stage页面,确认是具体哪个stage导致的数据运行较慢,或者内存溢出。接着stage点击对应的DAG图例,查看具体是哪个表的那个算子操作导致的运行缓慢。一般都是groupby或者join算子中的shuffle操作。

图片

4.数据倾斜处理

1)脏数据清理

通常出现在长期正常运行的任务突然出现OOM的情况。先利用sample函数进行采样,再统计key值的频数值,这时候会发现有部分key值属于异常的脏数据,例如空串、0值、异常重复值等等,该部分数据直接剔出即可解决。

2)大表join小表,map join优化

如果执行join操作的左右表是一大一小两个表,那么我们可以使用map join的方式,将小表数据广播到大表端,这个操作避免了shuffle过程,从而不产生大量数据在某几个task传输的情况。

3)大表group by key,二段聚合

但大表操作一定需要shuffle时,我们可以通过二段聚合的方式来缓解数据倾斜。给部分热点key加上0-100的随机数前缀,这样热点key会自动的分到100个任务节点进行传输,接着去掉随机前缀再次聚合,从而实现热点key值的负载均衡,最终环节数据倾斜。

4)大表join大表,加随机前缀后再join

两个大表join时,给左表key打上1~N的前缀,同时,右表数据每行都膨胀N条,并打上1~N前缀(保证每行左表记录都可以关联右表记录),再进行join即可。可以人为的将热点key分拆到N个节点从而避免了部分节点负载过高。

5.数据倾斜的预防

1)可以通过spark的AQE特性进行数据倾斜的自动处理。具体可以参考上一节spark基础中的AQE概念、特性、参数等相关问题。

2)也可以通过DQC的预检查手段来检查上游数据源,发现key值分布极度不均衡时,提前报出风险。

6.真题回顾

支付宝数据开发一面

TIKTOK数据开发一面

滴滴数据开发一面

百度数据开发二面

作业帮数据开发一面

字节中台数据开发一面

途虎养车数据开发一面

字节生服数据开发一面

图片

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值