1. 程式人生 > >Spark調優--效能調優

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上獲取變量了