背景
老劉最近晚上會刷刷牛客網的大資料開發面經,總是會看到一個高頻的面試題,那就是你在學習過程中遇到過什麼問題嗎?
這個問題其實有點難回答,如果我說的太簡單了,會不會讓面試官覺得水平太低,那我應該講什麼東西呢?我一個自學的不可能遇到什麼高階問題呀!
對於這個問題的答案網上也是眾說紛紜,老劉也講講對這個問題的看法,分享一下自己的見解,歡迎各位夥伴前來battle!
過程
在尋找這個問題答案的過程中,老劉正好在學習spark框架的實時計算模組SparkStreaming,它裡面就有一個非常經典的問題,關於推測機制的!
什麼是推測機制?
如果有很多個task都在執行,很多task一下就完成了自己的任務,但是有一個task執行的很慢。在實時計算任務中,如果對實時性要求比較高,就算是兩三秒也要在乎這些。
所以在sparkstreaming中有一個推測機制專門來解決這個執行的很慢的task。
每隔一段時間來檢查有哪些正在執行的task需要重新排程,假設總的task有10個,成功執行的task數量>0.75x10,正在執行的task的執行時間>1.5x成功執行task的平均時間,則這個正在執行的task需要重新等待排程。
但是這裡有一個很嚴重的問題,最開始自學的時候發現了,接著在看一些機構視訊裡面也有講到這個問題,說明老劉在自學過程中覺悟也在慢慢提高。
這個問題就是如果這個正在執行的task遇到資料傾斜怎麼辦?
假如有5個task,有一個task遇到了資料傾斜,但就算遇到資料傾斜(稍微有點資料傾斜,也沒事),它也會完成任務,它需要6s,其他4個任務只需要1s。那開啟推測機制後,這個任務好不容易執行到了2s,快要成功了,但遇到了推測機制,它就需要重新排程重新執行,下一次執行了3s,遇到推測機制就會重新執行,整個過程一直在迴圈,這就是老劉要說的問題!
某個培訓機構視訊裡面的老師說這個問題還行,老劉自己也想到了看出了推測機制的這個缺點,所以就分享給大家!
解決
那開啟推測機制遇到資料傾斜,怎麼辦?
我們可以採用一些解決資料傾斜的辦法,老劉大致講一下關於資料傾斜的幾個解決方案:
1、如果發現導致資料傾斜的key就幾個,而且對計算本身的影響並不大的話,就可以採用過濾少數導致傾斜的key
2、兩階段聚合,將原本相同的key通過附加隨機字首的方式,變成多個不同的key,就可以讓原本被一個task處理的資料分散到多個task上去做區域性聚合,進而解決單個task處理資料量過多的問題。接著去除掉隨機字首,再次進行全域性聚合,就可以得到最終的結果。但是這個方法只適用於聚合類的shuffle操作,不適合join類的shuffle操作。
3、對於join導致的資料傾斜,如果只是某幾個key導致了傾斜,可以將少數幾個key分拆成獨立RDD,並附加隨機字首打散成n份去進行join,此時這幾個key對應的資料就不會集中在少數幾個task上,而是分散到多個task進行join了。適用於兩個資料量比較大的表進行join。
4、如果在進行join操作時,RDD中有大量的key導致資料傾斜,那麼進行分拆key也沒什麼意義,此時就只能使用這一種方案來解決問題了。將原先一樣的key通過附加隨機字首變成不一樣的key,然後就可以將這些處理後的“不同key”分散到多個task中去處理,而不是讓一個task處理大量的相同key。
好啦,SparkStreaming推測機制講完了,大家以後可以拿這塊的內容回答面試官。如果有什麼問題,可以聯絡公眾號:努力的老劉,歡迎大家來和老劉battle!