SparkStreaming推測(cè)機(jī)制:面試被問遇到什么問題,說(shuō)這個(gè)顯水平!

背景

老劉最近晚上會(huì)刷刷牛客網(wǎng)的大數(shù)據(jù)開發(fā)面經(jīng),總是會(huì)看到一個(gè)高頻的面試題,那就是你在學(xué)習(xí)過(guò)程中遇到過(guò)什么問題嗎?

這個(gè)問題其實(shí)有點(diǎn)難回答,如果我說(shuō)的太簡(jiǎn)單了,會(huì)不會(huì)讓面試官覺得水平太低,那我應(yīng)該講什么東西呢?我一個(gè)自學(xué)的不可能遇到什么高級(jí)問題呀!

對(duì)于這個(gè)問題的答案網(wǎng)上也是眾說(shuō)紛紜,老劉也講講對(duì)這個(gè)問題的看法,分享一下自己的見解,歡迎各位伙伴前來(lái)battle!

過(guò)程

在尋找這個(gè)問題答案的過(guò)程中,老劉正好在學(xué)習(xí)spark框架的實(shí)時(shí)計(jì)算模塊SparkStreaming,它里面就有一個(gè)非常經(jīng)典的問題,關(guān)于推測(cè)機(jī)制的!

什么是推測(cè)機(jī)制?

如果有很多個(gè)task都在運(yùn)行,很多task一下就完成了自己的任務(wù),但是有一個(gè)task運(yùn)行的很慢。在實(shí)時(shí)計(jì)算任務(wù)中,如果對(duì)實(shí)時(shí)性要求比較高,就算是兩三秒也要在乎這些。

所以在sparkstreaming中有一個(gè)推測(cè)機(jī)制專門來(lái)解決這個(gè)運(yùn)行的很慢的task。

每隔一段時(shí)間來(lái)檢查有哪些正在運(yùn)行的task需要重新調(diào)度,假設(shè)總的task有10個(gè),成功運(yùn)行的task數(shù)量>0.75x10,正在運(yùn)行的task的運(yùn)行時(shí)間>1.5x成功運(yùn)行task的平均時(shí)間,則這個(gè)正在運(yùn)行的task需要重新等待調(diào)度。

但是這里有一個(gè)很嚴(yán)重的問題,最開始自學(xué)的時(shí)候發(fā)現(xiàn)了,接著在看一些機(jī)構(gòu)視頻里面也有講到這個(gè)問題,說(shuō)明老劉在自學(xué)過(guò)程中覺悟也在慢慢提高。

這個(gè)問題就是如果這個(gè)正在運(yùn)行的task遇到數(shù)據(jù)傾斜怎么辦?

假如有5個(gè)task,有一個(gè)task遇到了數(shù)據(jù)傾斜,但就算遇到數(shù)據(jù)傾斜(稍微有點(diǎn)數(shù)據(jù)傾斜,也沒事),它也會(huì)完成任務(wù),它需要6s,其他4個(gè)任務(wù)只需要1s。那開啟推測(cè)機(jī)制后,這個(gè)任務(wù)好不容易運(yùn)行到了2s,快要成功了,但遇到了推測(cè)機(jī)制,它就需要重新調(diào)度重新運(yùn)行,下一次運(yùn)行了3s,遇到推測(cè)機(jī)制就會(huì)重新運(yùn)行,整個(gè)過(guò)程一直在循環(huán),這就是老劉要說(shuō)的問題!

某個(gè)培訓(xùn)機(jī)構(gòu)視頻里面的老師說(shuō)這個(gè)問題還行,老劉自己也想到了看出了推測(cè)機(jī)制的這個(gè)缺點(diǎn),所以就分享給大家!

解決

那開啟推測(cè)機(jī)制遇到數(shù)據(jù)傾斜,怎么辦?

我們可以采用一些解決數(shù)據(jù)傾斜的辦法,老劉大致講一下關(guān)于數(shù)據(jù)傾斜的幾個(gè)解決方案:

1、如果發(fā)現(xiàn)導(dǎo)致數(shù)據(jù)傾斜的key就幾個(gè),而且對(duì)計(jì)算本身的影響并不大的話,就可以采用過(guò)濾少數(shù)導(dǎo)致傾斜的key

2、兩階段聚合,將原本相同的key通過(guò)附加隨機(jī)前綴的方式,變成多個(gè)不同的key,就可以讓原本被一個(gè)task處理的數(shù)據(jù)分散到多個(gè)task上去做局部聚合,進(jìn)而解決單個(gè)task處理數(shù)據(jù)量過(guò)多的問題。接著去除掉隨機(jī)前綴,再次進(jìn)行全局聚合,就可以得到最終的結(jié)果。但是這個(gè)方法只適用于聚合類的shuffle操作,不適合join類的shuffle操作。

3、對(duì)于join導(dǎo)致的數(shù)據(jù)傾斜,如果只是某幾個(gè)key導(dǎo)致了傾斜,可以將少數(shù)幾個(gè)key分拆成獨(dú)立RDD,并附加隨機(jī)前綴打散成n份去進(jìn)行join,此時(shí)這幾個(gè)key對(duì)應(yīng)的數(shù)據(jù)就不會(huì)集中在少數(shù)幾個(gè)task上,而是分散到多個(gè)task進(jìn)行join了。適用于兩個(gè)數(shù)據(jù)量比較大的表進(jìn)行join。

4、如果在進(jìn)行join操作時(shí),RDD中有大量的key導(dǎo)致數(shù)據(jù)傾斜,那么進(jìn)行分拆key也沒什么意義,此時(shí)就只能使用這一種方案來(lái)解決問題了。將原先一樣的key通過(guò)附加隨機(jī)前綴變成不一樣的key,然后就可以將這些處理后的“不同key”分散到多個(gè)task中去處理,而不是讓一個(gè)task處理大量的相同key。

好啦,SparkStreaming推測(cè)機(jī)制講完了,大家以后可以拿這塊的內(nèi)容回答面試官。如果有什么問題,可以聯(lián)系公眾號(hào):努力的老劉,歡迎大家來(lái)和老劉battle!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容