在面试大数据开发岗位中,Spark是必须具备的技能之一。
最近在复习Spark时,感觉spark发生数据倾斜场景有很多,但是在面试时,说太多了感觉太废话了。如何在面试中思维清晰的回答数据倾斜问题呢?下面是个人总结的观点,有问题麻烦各位技术大佬指导。
数据倾斜原理:在进行shuffle的时候,必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行 聚合或join等操作。此时如果某个key对应的数据量特别大的话,就会发生数据倾斜。比如大部分key对应10条数据,但是个别key却对应了100万条数据,那么大部分task可能就只会分配到10条数据,然后1秒钟就运行完了;但是个别task可能分配到了100万数据,要运行一两个小时。因此,整个Spark作业的运行进度是由运行时间最长的那个task决定的。
数据倾斜解决方案:
发生数据倾斜一般都是出现了shuffle操作,shuffle操作一般都是由聚合算子和Join所引发,所以我们从这两方面去解决问题。
1、两阶段聚合(局部聚合+全局聚合,针对聚合算子)
方案适用场景:对RDD执行reduceByKey等聚合类shuffle算子或者在Spark SQL中使用group by语句进行分组聚合时,比较适用这种方案。
方案实现思路:这个方案的核心实现思路就是进行两阶段聚合。第一次是局部聚合,先给每个key都打上一个随机 数,比如10以内的随机数,此时原先一样的key就变成不一样的了,比如(hello, 1) (hello, 1) (hello, 1) (hello, 1),就会变成(1_hello, 1) (1_hello, 1) (2_hello, 1) (2_hello, 1)。接着对打上随机数后的数据,执行reduceByKey等聚合操作,进行局部聚合,那么局部聚合结果,就会变成了(1_hello, 2) (2_hello, 2)。然后将各个key的前缀给去掉,就会变成(hello,2)(hello,2),再次进行全局聚合操作,就可以得到最终结果了,比如(hello, 4)。
方案实现原理:</

本文详细探讨了Spark数据倾斜的原理及解决方案,包括两阶段聚合、广播小表的Map Join、采样倾斜Key分拆Join操作以及使用随机前缀扩容RDD进行Join,针对不同场景提出了解决数据倾斜的有效方法,旨在帮助大数据开发面试者清晰解答相关问题。
最低0.47元/天 解锁文章
2346

被折叠的 条评论
为什么被折叠?



