原文來我的公眾號:Spark性能優化指南——初級篇
一. Spark作業原理
我們使用spark-submit提交一個Spark作業之后,這個作業就會啟動一個對應的Driver行程,該行程是向集群管理器(Yarn,K8s)申請運行Spark作業需要使用的資源,這里的資源指的就是Executor行程,YARN集群管理器會根據我們為Spark作業設定的資源引數,在各個作業節點上,啟動一定數量的Executor行程,每個Executor行程都占有一定數量的記憶體和CPU core,二.核心調優引數
num-executors:
該引數用于設定Spark作業總共要用多少個Executor行程來執行,Driver在向YARN集群管理器申請資源時,YARN集群管理器會盡可能按照你的設定來在集群的各個作業節點上,啟動相應數量的Executor行程,這個引數非常之重要,如果不設定的話,默認只會給你啟動少量的Executor行程,此時你的Spark作業的運行速度是非常慢的,(建議50~100個左右的Executor行程)executor-memory:
該引數用于設定每個Executor行程的記憶體,Executor記憶體的大小,很多時候直接決定了Spark作業的性能,而且跟常見的JVM OOM例外,也有直接的關聯,(根據作業大小不同,建議設定4G~8G,num-executors乘以executor-memory,是不能超過佇列的最大記憶體量的)executor-cores:
該引數用于設定每個Executor行程的CPU core數量,這個引數決定了每個Executor行程并行執行task執行緒的能力,因為每個CPU core同一時間只能執行一個task執行緒,因此每個Executor行程的CPU core數量越多,越能夠快速地執行完分配給自己的所有task執行緒,(建議設定為2~4個,且num-executors * executor-cores不要超過佇列總CPU core的1/3~1/2)driver-memory:
該引數用于設定Driver行程的記憶體(建議設定512M到1G),spark.default.parallelism:
該引數用于設定每個stage的默認task數量,這個引數極為重要,如果不設定可能會直接影響你的Spark作業性能,(建議為50~500左右,預設情況下Spark自己根據底層HDFS的block數量來設定task的數量,默認是一個HDFS block對應一個task,Spark官網建議設定該引數為num-executors * executor-cores的2~3倍較為合適)spark.storage.memoryFraction:
該引數用于設定RDD持久化資料在Executor記憶體中能占的比例,默認是0.6(原則上是盡可能保證資料能夠全部在記憶體中,但如果發現作業發生頻繁的GC,就該考慮是否調小)spark.shuffle.memoryFraction:
該引數用于設定shuffle程序中一個task拉取到上個stage的task的輸出后,進行聚合操作時能夠使用的Executor記憶體的比例,默認是0.2,也就是說,Executor默認只有20%的記憶體用來進行該操作,shuffle操作在進行聚合時,如果發現使用的記憶體超出了這個20%的限制,那么多余的資料就會溢寫到磁盤檔案中去,此時就會極大地降低性能,(shuffle操作較多時,建議降低持久化操作的記憶體占比,提高shuffle操作的記憶體占比比例,避免shuffle程序中資料過多時記憶體不夠用,必須溢寫到磁盤上,降低了性能)
微信掃描二維碼,關注我的公眾號我的個人網站:http://www.itrensheng.com/
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/37842.html
標籤:大數據
上一篇:大資料運維:大資料平臺+海量資料
下一篇:Vmvare擴展虛擬機磁盤大小
