前天跟大家聊spark優化,說了個大體上的方案,今天就性能調優跟大家聊聊,首先分如下4塊
一> 配置設定更多資源
配置設定哪些資源?
Executor的數量,每個executor所能配置設定的cpu數量,記憶體量,driver配置設定的記憶體量
在哪裡配置設定呢?
在開發中,送出spark作業時,用的是spark-submit shell腳本,裡面調整對應的參數
為什麼得到這些資源以後,性能會得到提升?
I 如果需要對RDD進行cache,增加了記憶體,那麼可以緩存更多的資料,将更少的資料寫入磁盤,甚至不寫入磁盤,減少了IO操作
II 對于shuffle操作,reduce端在拉去資料進行聚合的時候,入股記憶體不夠,資料會寫到磁盤,reduce就回去磁盤拉去,增加了IO操作,反之,記憶體相對大點,可以直接去記憶體拉,增加速度了
III 對于task的執行,可能會建立很多對象,如果記憶體比較小可能會頻繁導緻JVM堆記憶體滿了,頻繁垃圾回收,增大記憶體,速度會變快
一> 調節并行度
比如說有50個節點(executor),每個節點有3個core,那麼叢集開啟可以一次跑150個task,如果不設定task數量,比如現在100個task開始跑的時候會白白浪費1/3的executor是以,要合理調節task跟core的數量
設定core跟Tast的數量 官方是推薦,task數量,設定成spark application總cpu core數量的2~3倍,比如150個cpu core,基本要設定task數量為300~500。
一> RDD持久化
将資料持久化到記憶體,下次直接到記憶體取資料,更快
一> 廣播變量
在我們送出作業的時候,需要傳遞到executor上的task去運作,對于一些固定的資料每次都需要Driver廣播到task上,效率低,廣播變量允許将變量廣播到executor上的BlockManager,這樣以後每個Task擷取變量的時候可以直接在本地的BlockManager上擷取變量了
下篇介紹 shuffle跟jvm調優https://blog.csdn.net/qq_32736999/article/details/84022458