MapReduce參數優化
資源相關參數
-
這些參數都需要在mapred-site.xml中配置
mapreduce.map.memory.mb
一個 MapTask 可使用的資源上限(單位:MB),默認為1024
如果 MapTask 實際使用的資源量超過該值,則會被強制殺死。
mapreduce.reduce.memory.mb
一個 ReduceTask 可使用的資源上限(單位:MB),默認為1024
如果 ReduceTask 實際使用的資源量超過該值,則會被強制殺死。
mapred.child.java.opts
配置每個 map 或者 reduce 使用的內存的大小,默認是200M
mapreduce.map.cpu.vcores
每個 MapTask 可使用的最多 CPU Core 數目, 默認值: 1
mapreduce.reduce.cpu.vcores
每個 ReduceTask 可使用的最多 CPU Core 數目, 默認值: 1
最后兩個vcores指的是virtual core/虛擬核處理器
剩下兩個參數要在yarn集群啟動之前配置
mapreduce.task.io.sort.mb
shuffle的環形緩沖區大小,默認 100M
mapreduce.map.sort.spill.percent
環形緩沖區溢出的閾值,默認 80%
-
這些參數都需要在yarn-site.xml中配置(在yarn集群啟動之前進行配置)
yarn.scheduler.minimum-allocation-mb
給應用程序container分配的最小內存,默認 1024M
yarn.scheduler.maximum-allocation-mb
給應用程序container分配的最大內存,默認 8192M
yarn.scheduler.minimum-allocation-vcores
container最小的虛擬內核的個數,默認 1個
yarn.scheduler.maximum-allocation-vcores
container最大的虛擬內核的個數,默認 32個
yarn.nodemanager.resource.memory-mb
給每個nodemanager的內存資源,默認 8192M
容錯相關參數
- mapreduce.map.maxattempts
每個Map Task最大重試次數,一旦重試參數超過該值,則認為Map Task運行失敗,默認值:4 - mapreduce.reduce.maxattempts
每個Reduce Task最大重試次數,一旦重試參數超過該值,則認為Map Task運行失敗,默認值:4 - mapreduce.job.maxtaskfailures.per.tracker
當失敗的 MapTask 失敗比例超過該值時,整個作業則失敗,默認值為 0
如果你的應用程序允許丟棄部分輸入數據,則該該值設為一個大於0的值。
比如5,表示如果有低於5%的MapTask失敗,整個作業仍認為成功。 - mapreduce.task.timeout
Task超時時間,默認值為600000毫秒(經常需要設置的一個參數)
該參數表達的意思為:如果一個task在一定時間內沒有任何進入,即不會讀取新的數據,也沒有輸出數據,則認為該task處於block狀態,可能是卡住了
為了防止因為用戶程序永遠block住不退出,則強制設置了一個該超時時間。如果你的程序對每條輸入數據的處理時間過長(比如會訪問數據庫,通過網絡拉取數據等),建議將該參數調大.
該參數過小常出現的錯誤提示是AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by the ApplicationMaster.
- 一般一個任務長時間沒有完成,可能是因為數據傾斜造成的
數據傾斜:大量的數據都涌到同一個reduceTask里面去,造成一個reduceTask里面處理得數據量太大,遲遲不能完成。比如,reduceTakss完成80%就不動了,很有可能就是發生了數據傾斜。
效率和穩定性相關參數
- mapreduce.map.speculative
是否為Map Task打開推測執行機制,默認為true。
如果Map執行時間比較長,那么集群就會推測這個Map已經卡住了,會重新啟動同樣的Map進行並行的執行,哪個先執行完了,就采取哪個的結果來作為最終結果 - mapreduce.reduce.speculative
是否為Reduce Task打開推測執行機制,默認為true。
如果reduce執行時間比較長,那么集群就會推測這個reduce已經卡住了,會重新啟動同樣的reduce進行並行的執行,哪個先執行完了,就采取哪個的結果來作為最終結果
推測執行並不能解決數據傾斜的問題,反而會更加浪費內存資源,所以一般關掉