〇、前言
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打上1N的前缀,同时,右表数据每行都膨胀N条,并打上1N前缀(保证每行左表记录都可以关联右表记录),再进行join即可。可以人为的将热点key分拆到N个节点从而避免了部分节点负载过高。
5.数据倾斜的预防
1)可以通过spark的AQE特性进行数据倾斜的自动处理。具体可以参考上一节spark基础中的AQE概念、特性、参数等相关问题。
2)也可以通过DQC的预检查手段来检查上游数据源,发现key值分布极度不均衡时,提前报出风险。
6.真题回顾
支付宝数据开发一面
TIKTOK数据开发一面
滴滴数据开发一面
百度数据开发二面
作业帮数据开发一面
字节中台数据开发一面
途虎养车数据开发一面
字节生服数据开发一面
版权归原作者 Ethan扯数据 所有, 如有侵权,请联系我们删除。