Driver
spark.driver.cores
driver端分配的核數,默認為1,thriftserver是啟動thriftserver服務的機器,資源充足的話可以盡量給多。
spark.driver.memory
driver端分配的內存數,默認為1g,同上。
spark.driver.maxResultSize
driver端接收的最大結果大小,默認1GB,最小1MB,設置0為無限。
這個參數不建議設置的太大,如果要做數據可視化,更應該控制在20-30MB以內。過大會導致OOM。
spark.extraListeners
默認none,隨著SparkContext被創建而創建,用于監聽單參數、無參數構造函數的創建,并拋出異常。
Executor
spark.executor.memory
每個executor分配的內存數,默認1g,會受到yarn CDH的限制,和memoryOverhead相加 不能超過總內存限制。
spark.executor.cores
每個executor的核數,默認yarn下1核,standalone下為所有可用的核。
spark.default.parallelism
默認RDD的分區數、并行數。
像reduceByKey和join等這種需要分布式shuffle的操作中,最大父RDD的分區數;像parallelize之類沒有父RDD的操作,則取決于運行環境下得cluster manager:
如果為單機模式,本機核數;集群模式為所有executor總核數與2中最大的一個。
spark.executor.heartbeatInterval
executor和driver心跳發送間隔,默認10s,必須遠遠小于spark.network.timeout
spark.files.fetchTimeout
從driver端執行SparkContext.addFile() 抓取添加的文件的超時時間,默認60s
spark.files.useFetchCache
默認true,如果設為true,拉取文件時會在同一個application中本地持久化,被若干個executors共享。這使得當同一個主機下有多個executors時,執行任務效率提高。
spark.broadcast.blockSize
TorrentBroadcastFactory中的每一個block大小,默認4m
過大會減少廣播時的并行度,過小會導致BlockManager 產生 performance hit.
spark.files.overwrite
默認false,是否在執行SparkContext.addFile() 添加文件時,覆蓋已有的內容有差異的文件。
spark.files.maxPartitionBytes
單partition中最多能容納的文件大小,單位Bytes 默認134217728 (128 MB)
spark.files.openCostInBytes
小文件合并閾值,小于該參數就會被合并到一個partition內。
默認4194304 (4 MB) 。這個參數在將多個文件放入一個partition時被用到,寧可設置的小一些,因為在partition操作中,小文件肯定會比大文件快。
spark.storage.memoryMapThreshold
從磁盤上讀文件時,最小單位不能少于該設定值,默認2m,小于或者接近操作系統的每個page的大小。
Shuffle
spark.reducer.maxSizeInFlight
默認48m。從每個reduce任務同時拉取的最大map數,每個reduce都會在完成任務后,需要一個堆外內存的緩沖區來存放結果,如果沒有充裕的內存就盡可能把這個調小一點。。相反,堆外內存充裕,調大些就能節省gc時間。
spark.reducer.maxBlocksInFlightPerAddress
限制了每個主機每次reduce可以被多少臺遠程主機拉取文件塊,調低這個參數可以有效減輕node manager的負載。(默認值Int.MaxValue)
spark.reducer.maxReqsInFlight
限制遠程機器拉取本機器文件塊的請求數,隨著集群增大,需要對此做出限制。否則可能會使本機負載過大而掛掉。。(默認值為Int.MaxValue)
spark.reducer.maxReqSizeShuffleToMem
shuffle請求的文件塊大小 超過這個參數值,就會被強行落盤,防止一大堆并發請求把內存占滿。(默認Long.MaxValue)
spark.shuffle.compress
是否壓縮map輸出文件,默認壓縮 true
spark.shuffle.spill.compress
shuffle過程中溢出的文件是否壓縮,默認true,使用spark.io.compression.codec壓縮。
spark.shuffle.file.buffer
在內存輸出流中 每個shuffle文件占用內存大小,適當提高 可以減少磁盤讀寫 io次數,初始值為32k
spark.shuffle.memoryFraction
該參數代表了Executor內存中,分配給shuffle read task進行聚合操作的內存比例,默認是20%。
cache少且內存充足時,可以調大該參數,給shuffle read的聚合操作更多內存,以避免由于內存不足導致聚合過程中頻繁讀寫磁盤。
spark.shuffle.manager
當ShuffleManager為SortShuffleManager時,如果shuffle read task的數量小于這個閾值(默認是200),則shuffle write過程中不會進行排序操作,而是直接按照未經優化的HashShuffleManager的方式去寫數據,但是最后會將每個task產生的所有臨時磁盤文件都合并成一個文件,并會創建單獨的索引文件。
當使用SortShuffleManager時,如果的確不需要排序操作,那么建議將這個參數調大一些,大于shuffle read task的數量。那么此時就會自動啟用bypass機制,map-side就不會進行排序了,減少了排序的性能開銷。但是這種方式下,依然會產生大量的磁盤文件,因此shuffle write性能有待提高。
spark.shuffle.consolidateFiles
如果使用HashShuffleManager,該參數有效。如果設置為true,那么就會開啟consolidate機制,會大幅度合并shuffle write的輸出文件,對于shuffle read task數量特別多的情況下,這種方法可以極大地減少磁盤IO開銷,提升性能。
如果的確不需要SortShuffleManager的排序機制,那么除了使用bypass機制,還可以嘗試將spark.shuffle.manager參數手動指定為hash,使用HashShuffleManager,同時開啟consolidate機制。
spark.shuffle.io.maxRetries
shuffle read task從shuffle write task所在節點拉取屬于自己的數據時,如果因為網絡異常導致拉取失敗,是會自動進行重試的。該參數就代表了可以重試的最大次數。如果在指定次數之內拉取還是沒有成功,就可能會導致作業執行失敗。
對于那些包含了特別耗時的shuffle操作的作業,建議增加重試最大次數(比如60次),以避免由于JVM的full gc或者網絡不穩定等因素導致的數據拉取失敗。在實踐中發現,對于針對超大數據量(數十億~上百億)的shuffle過程,調節該參數可以大幅度提升穩定性。
spark.shuffle.io.retryWait
同上,默認5s,建議加大間隔時長(比如60s),以增加shuffle操作的穩定性
Compression and Serialization
spark.broadcast.compress
廣播變量前是否會先進行壓縮。默認true (spark.io.compression.codec)
spark.io.compression.codec
壓縮RDD數據、日志、shuffle輸出等的壓縮格式 默認lz4
spark.io.compression.lz4.blockSize
使用lz4壓縮時,每個數據塊大小 默認32k
spark.rdd.compress
rdd是否壓縮 默認false,節省memory_cache大量內存 消耗更多的cpu資源(時間)。
spark.serializer.objectStreamReset
當使用JavaSerializer序列化時,會緩存對象防止寫多余的數據,但這些對象就不會被gc,可以輸入reset 清空緩存。默認緩存100個對象,修改成-1則不緩存任何對象。
Memory Management
spark.memory.fraction
執行內存和緩存內存(堆)占jvm總內存的比例,剩余的部分是spark留給用戶存儲內部源數據、數據結構、異常大的結果數據。
默認值0.6,調小會導致頻繁gc,調大容易造成oom。
spark.memory.storageFraction
用于存儲的內存在堆中的占比,默認0.5。調大會導致執行內存過小,執行數據落盤,影響效率;調小會導致緩存內存不夠,緩存到磁盤上去,影響效率。
值得一提的是在spark中,執行內存和緩存內存公用java堆,當執行內存沒有使用時,會動態分配給緩存內存使用,反之也是這樣。如果執行內存不夠用,可以將存儲內存釋放移動到磁盤上(最多釋放不能超過本參數劃分的比例),但存儲內存不能把執行內存搶走。
spark.memory.offHeap.enabled
是否允許使用堆外內存來進行某些操作。默認false
spark.memory.offHeap.size
允許使用進行操作的堆外內存的大小,單位bytes 默認0
spark.cleaner.periodicGC.interval
控制觸發gc的頻率,默認30min
spark.cleaner.referenceTracking
是否進行context cleaning,默認true
spark.cleaner.referenceTracking.blocking
清理線程是否應該阻止清理任務,默認true
spark.cleaner.referenceTracking.blocking.shuffle
清理線程是否應該阻止shuffle的清理任務,默認false
spark.cleaner.referenceTracking.cleanCheckpoints
清理線程是否應該清理依賴超出范圍的檢查點文件(checkpoint files不知道怎么翻譯。。)默認false
Networking
spark.rpc.message.maxSize
executors和driver間消息傳輸、map輸出的大小,默認128M。map多可以考慮增加。
spark.driver.blockManager.port和spark.driver.bindAddress
driver端綁定監聽block manager的地址與端口。
spark.driver.host和spark.driver.port
driver端的ip和端口。
spark.network.timeout
網絡交互超時時間,默認120s。如果
spark.core.connection.ack.wait.timeout
spark.storage.blockManagerSlaveTimeoutMs
spark.shuffle.io.connectionTimeout
spark.rpc.askTimeout orspark.rpc.lookupTimeout
沒有設置,那么就以此參數為準。
spark.port.maxRetries
設定了一個端口后,在放棄之前的最大重試次數,默認16。 會有一個預重試機制,每次會嘗試前一次嘗試的端口號+1的端口。如 設定了端口為8000,則最終會嘗試8000~(8000+16)范圍的端口。
spark.rpc.numRetries
rpc任務在放棄之前的重試次數,默認3,即rpc task最多會執行3次。
spark.rpc.retry.wait
重試間隔,默認3s
spark.rpc.askTimeout
rpc任務超時時間,默認spark.network.timeout
spark.rpc.lookupTimeout
rpc任務查找時長
Scheduling
spark.scheduler.maxRegisteredResourcesWaitingTime
在執行前最大等待申請資源的時間,默認30s。
spark.scheduler.minRegisteredResourcesRatio
實際注冊的資源數占預期需要的資源數的比例,默認0.8
spark.scheduler.mode
調度模式,默認FIFO 先進隊列先調度,可以選擇FAIR。
spark.scheduler.revive.interval
work回復重啟的時間間隔,默認1s
spark.scheduler.listenerbus.eventqueue.capacity
spark事件監聽隊列容量,默認10000,必須為正值,增加可能會消耗更多內存
spark.blacklist.enabled
是否列入黑名單,默認false。如果設成true,當一個executor失敗好幾次時,會被列入黑名單,防止后續task派發到這個executor。可以進一步調節spark.blacklist以下相關的參數:
(均為測試參數 Experimental)
spark.blacklist.timeout
spark.blacklist.task.maxTaskAttemptsPerExecutor
spark.blacklist.task.maxTaskAttemptsPerNode
spark.blacklist.stage.maxFailedTasksPerExecutor
spark.blacklist.application.maxFailedExecutorsPerNode
spark.blacklist.killBlacklistedExecutors
spark.blacklist.application.fetchFailure.enabled
spark.speculation
推測,如果有task執行的慢了,就會重新執行它。默認false,
詳細相關配置如下:
spark.speculation.interval
檢查task快慢的頻率,推測間隔,默認100ms。
spark.speculation.multiplier
推測比均值慢幾次算是task執行過慢,默認1.5
spark.speculation.quantile
在某個stage,完成度必須達到該參數的比例,才能被推測,默認0.75
spark.task.cpus
每個task分配的cpu數,默認1
spark.task.maxFailures
在放棄這個job前允許的最大失敗次數,重試次數為該參數-1,默認4
spark.task.reaper.enabled
賦予spark監控有權限去kill那些失效的task,默認false
(原先有 job失敗了但一直顯示有task在running,總算找到這個參數了)
其他進階的配置如下:
spark.task.reaper.pollingInterval
輪詢被kill掉的task的時間間隔,如果還在running,就會打warn日志,默認10s。
spark.task.reaper.threadDump
線程回收是是否產生日志,默認true。
spark.task.reaper.killTimeout
當一個被kill的task過了多久還在running,就會把那個executor給kill掉,默認-1。
spark.stage.maxConsecutiveAttempts
在終止前,一個stage連續嘗試次數,默認4。
Dynamic Allocation
spark.dynamicAllocation.enabled
是否開啟動態資源配置,根據工作負載來衡量是否應該增加或減少executor,默認false
以下相關參數:
spark.dynamicAllocation.minExecutors
動態分配最小executor個數,在啟動時就申請好的,默認0
spark.dynamicAllocation.maxExecutors
動態分配最大executor個數,默認infinity
spark.dynamicAllocation.initialExecutors
動態分配初始executor個數默認值=spark.dynamicAllocation.minExecutors
spark.dynamicAllocation.executorIdleTimeout
當某個executor空閑超過這個設定值,就會被kill,默認60s
spark.dynamicAllocation.cachedExecutorIdleTimeout
當某個緩存數據的executor空閑時間超過這個設定值,就會被kill,默認infinity
spark.dynamicAllocation.schedulerBacklogTimeout
任務隊列非空,資源不夠,申請executor的時間間隔,默認1s
spark.dynamicAllocation.sustainedSchedulerBacklogTimeout
同schedulerBacklogTimeout,是申請了新executor之后繼續申請的間隔,默認=schedulerBacklogTimeout
Spark Streaming
spark.streaming.stopGracefullyOnShutdown (true / false)默認fasle
確保在kill任務時,能夠處理完最后一批數據,再關閉程序,不會發生強制kill導致數據處理中斷,沒處理完的數據丟失
spark.streaming.backpressure.enabled (true / false) 默認false
開啟后spark自動根據系統負載選擇最優消費速率
spark.streaming.backpressure.initialRate (整數) 默認直接讀取所有
在開啟反壓的情況下,限制第一次批處理應該消費的數據,因為程序冷啟動隊列里面有大量積壓,防止第一次全部讀取,造成系統阻塞
spark.streaming.kafka.maxRatePerPartition (整數) 默認直接讀取所有
限制每秒每個消費線程讀取每個kafka分區最大的數據量
spark.streaming.unpersist
自動將spark streaming產生的、持久化的數據給清理掉,默認true,自動清理內存垃圾。
spark.streaming.ui.retainedBatches
spark streaming 日志接口在gc時保留的batch個數,默認1000