Spark調優--效能調優
前天跟大家聊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上獲取變量了