Spark任務參數優化
當我們提交Spark作業的時候,Spark作業會啟動Driver進程去運行Application的main()函數,并且創建SparkContext,然后通過SparkContext與集群管理器申請Spark作業所需的資源,即Spark作業所需要的Executor進程。集群管理器會根據提交作業的資源參數設置,為各個工作節點分配相應數量的Executor,以及每個Executor所占用的內存數量和CPU Core核心數。
當資源分配完成以后,Driver便會開始運行我們的作業代碼,過程中,Driver會將我們的Spark作業根據邏輯拆解為多個stage,并將每個stage拆分為多個最小計算單元task,分配到各個Executor上去執行。當一個Stage的所有task執行完畢后,便會開始下一個stage的調度,直到我們的作業代碼執行完畢。
在作業的運行過程中,Executor主要占用的資源分別是Cpu核心數和內存大小,合理的分配資源的大小,可以有效的提高我們的作業執行效率。
我們的Cpu的每一個core在同一時間只能執行一個線程,而我們的Excutor每次都會接收到多個task任務,每個task任務會占用一個線程,Excutor以多線程并發形式運行,眾所周知,線程數量并非越多越好,只有當Cpu核心數與線程數數量相對合理,才能更加高效的處理task任務。
內存方面,Executor的內存主要分為三塊,分別是執行task任務所需的內存,獲取之前stage輸出的內存,以及RDD持久化所需要的內存,默認占比為2:2:6。
當了解了Spark的運行原理以及資源的使用方式以后,我們就可以通過修改Spark提供的資源參數,設置Spark作業的資源分配,以達到性能的優化。主要參數配置如下:
1.???? num-executors
excutor的個數:需要根據現有資源的大小情況進行合理配置,在考慮每個excutor的內存和核心數情況下,設置合理的個數以免資源的浪費。
2.???? executor-memory
executor的內存大?。嚎紤]作業情況不要設置的過小,過小可能會造成JVM OOM異常,占用的內存總量為num-executors*excutor-memory,需要注意不要超過當前資源的最大內存總量。
3.???? executor- cores
executor的單個core核心個數:在資源允許的情況下Excutor的核心數越多,作業的執行效率就會越高,占用的Cpu core總量為num-executors*excutor-cores,需要注意不要超過當前資源Cpu cores的總數。
4.???? spark.default.parallelism
stage劃分的task個數:task個數可以根據你設置的Executor的個數和Cpu核心數進行設置,一般推薦為num-executors*executor-cores的2~3倍。
5.???? spark.shuffle.memoryFraction
shuffle操作內存在Executor內存中的占比:默認值為0.2,即0.2*executor-memory的內存會被用來處理shuffle操作的數據,當內存不夠的時候,會將數據寫入磁盤保存,從而導致性能降低,當shuffle操作較多時,可以提高該占比。
6.???? spark.storage.memoryFraction
持久化操作內存在Executor內存中的占比:默認值為0.6,即0.6*executor-memory的內存會被用來保存持久化的RDD的數據,當內存不夠的時候,會將數據寫入磁盤保存,從而導致性能降低,當持久化操作較多時,可以提高該占比。
7.???? driver-memory
driver進程的內存大小:一般使用默認值即可,當Driver上的數據過多出現內存溢出的情況下,需要調整該參數。
EI企業智能 AI
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。