老刘最近晚上会刷刷牛客网的大数据开发面经,老是会看到一个高频的面试题,那就是你在学习过程当中遇到过什么问题吗?面试
这个问题其实有点难回答,若是我说的太简单了,会不会让面试官以为水平过低,那我应该讲什么东西呢?我一个自学的不可能遇到什么高级问题呀!框架
对于这个问题的答案网上也是众说纷纭,老刘也讲讲对这个问题的见解,分享一下本身的看法,欢迎各位伙伴前来battle!学习
在寻找这个问题答案的过程当中,老刘正好在学习spark框架的实时计算模块SparkStreaming,它里面就有一个很是经典的问题,关于推测机制的!大数据
什么是推测机制?spa
若是有不少个task都在运行,不少task一下就完成了本身的任务,可是有一个task运行的很慢。在实时计算任务中,若是对实时性要求比较高,就算是两三秒也要在意这些。视频
因此在sparkstreaming中有一个推测机制专门来解决这个运行的很慢的task。blog
每隔一段时间来检查有哪些正在运行的task须要从新调度,假设总的task有10个,成功运行的task数量>0.75x10,正在运行的task的运行时间>1.5x成功运行task的平均时间,则这个正在运行的task须要从新等待调度。开发
可是这里有一个很严重的问题,最开始自学的时候发现了,接着在看一些机构视频里面也有讲到这个问题,说明老刘在自学过程当中觉悟也在慢慢提升。spark
这个问题就是若是这个正在运行的task遇到数据倾斜怎么办?stream
假若有5个task,有一个task遇到了数据倾斜,但就算遇到数据倾斜(稍微有点数据倾斜,也没事),它也会完成任务,它须要6s,其余4个任务只须要1s。那开启推测机制后,这个任务好不容易运行到了2s,快要成功了,但遇到了推测机制,它就须要从新调度从新运行,下一次运行了3s,遇到推测机制就会从新运行,整个过程一直在循环,这就是老刘要说的问题!
某个培训机构视频里面的老师说这个问题还行,老刘本身也想到了看出了推测机制的这个缺点,因此就分享给你们!
那开启推测机制遇到数据倾斜,怎么办?
咱们能够采用一些解决数据倾斜的办法,老刘大体讲一下关于数据倾斜的几个解决方案:
一、若是发现致使数据倾斜的key就几个,并且对计算自己的影响并不大的话,就能够采用过滤少数致使倾斜的key
二、两阶段聚合,将本来相同的key经过附加随机前缀的方式,变成多个不一样的key,就可让本来被一个task处理的数据分散到多个task上去作局部聚合,进而解决单个task处理数据量过多的问题。接着去除掉随机前缀,再次进行全局聚合,就能够获得最终的结果。可是这个方法只适用于聚合类的shuffle操做,不适合join类的shuffle操做。
三、对于join致使的数据倾斜,若是只是某几个key致使了倾斜,能够将少数几个key分拆成独立RDD,并附加随机前缀打散成n份去进行join,此时这几个key对应的数据就不会集中在少数几个task上,而是分散到多个task进行join了。适用于两个数据量比较大的表进行join。
四、若是在进行join操做时,RDD中有大量的key致使数据倾斜,那么进行分拆key也没什么意义,此时就只能使用这一种方案来解决问题了。将原先同样的key经过附加随机前缀变成不同的key,而后就能够将这些处理后的“不一样key”分散到多个task中去处理,而不是让一个task处理大量的相同key。
好啦,SparkStreaming推测机制讲完了,你们之后能够拿这块的内容回答面试官。若是有什么问题,能够联系公众号:努力的老刘,欢迎你们来和老刘battle!