3.1 Spark Streaming 性能調(diào)優(yōu)(一): 提高并行度

目錄
1.系統(tǒng)架構(gòu)
2.環(huán)境搭建
2.1本地環(huán)境下kafka批量導(dǎo)入數(shù)據(jù)
2.2 kafka-manager的安裝與配置
3.1 Spark Streaming 性能調(diào)優(yōu)(一): 解決并行度
3.2 Spark Streaming 性能調(diào)優(yōu)(二): 解決task傾斜
根據(jù)前面幾篇文章,運(yùn)行該日志分析系統(tǒng)的環(huán)境與數(shù)據(jù)都已經(jīng)準(zhǔn)備好了,接下來就該進(jìn)行調(diào)試與排查性能瓶頸了。

問題分析

首先, 根據(jù)前面的一篇文章:2.1 本地環(huán)境下kafka批量導(dǎo)入數(shù)據(jù), 我分別模擬了數(shù)據(jù)在kafka的各個分區(qū)中分布均勻與分布不均勻兩種情況.下面來看看運(yùn)行結(jié)果對比:

測試環(huán)境: 本地, 開啟4個線程

數(shù)據(jù)分布不均下task的執(zhí)行情況

數(shù)據(jù)分布不均時的task運(yùn)行情況

從上圖可以看出, 在數(shù)據(jù)分布不均勻的情況下, 出現(xiàn)了部分task有數(shù)據(jù),部分task卻沒有數(shù)據(jù)的情況, 導(dǎo)致機(jī)器的cpu資源沒有得到充分利用.

task數(shù)據(jù)不均的原因

由于我這個日志分析系統(tǒng)是使用direct模式從kafka拉取數(shù)據(jù)的, 在direct模式下, 通過KafkaUtils.createDirectStream(...)獲取的DStream中的rdd的分區(qū)數(shù)是與kafka相對應(yīng)的topic的分區(qū)數(shù)是一樣的,且分區(qū)中的數(shù)據(jù)分布情況也是一樣的.
這就導(dǎo)致了spark streaming獲取的rdd的分區(qū)中只有一個是有數(shù)據(jù)的, 而task與分區(qū)也是一一對應(yīng)關(guān)系, 所以就造成了只有一個task在處理數(shù)據(jù).

數(shù)據(jù)分布均勻下task執(zhí)行情況

數(shù)據(jù)分布均勻下task執(zhí)行情況

從上圖可以看出, 數(shù)據(jù)均勻分布的話, 各個task處理的數(shù)據(jù)量都比較均勻, cpu資源的利用也提升了不少.

解決問題

問題逐漸清晰了, 其實(shí)就是線上從kafka獲取數(shù)據(jù)時, kafka中的分區(qū)數(shù)據(jù)分布不均, 導(dǎo)致部分task處理的數(shù)據(jù)量特別少, 集群cpu資源得不到充分利用.
而解決辦法就是, 利用DStream.reparation(partitionNum), 對DStream進(jìn)行重新分區(qū), 請注意, reparation()函數(shù)會對數(shù)據(jù)做shuffle, 這就相當(dāng)于將數(shù)據(jù)分配到了其他機(jī)器上.這樣就能提高并行度, 提高集群cpu資源利用率.

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

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

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