1.1做業某個任務阻塞了,長時間佔用資源不釋放java
1.2在MapTask任務運行完畢,ReduceTask運行過程當中,某個MapTask節點掛了,或者某個MapTask結果存放的那磁盤壞掉了node
在TaskTracker,每一個任務會按期向TaskTracker彙報進度,若是進度不變則不彙報,這樣一旦達到超時限制,TaskTracker會殺掉該任務,並將任務狀態KILLED彙報給YARN,從而從新調度該任務。性能優化
Case1:若是節點掛掉,JobTracker經過心跳機制知道TaskTracker死掉了,會從新調度以前正在運行的Task和正在運行的做業中已經運行完成的MapTask服務器
Case2:若是節點沒有掛,只是存放MapTask結果的磁盤損壞了,則分兩種狀況併發
#全部的ReduceTask已經完成shuffle階段框架
#尚有部分ReduceTask沒有完成shuffle階段,須要讀取該MapTask任務oop
後來經過調整mapreduce.reduce.java.opts=-Xmx5000m 任務才執行經過。也就是說shuffle要4G內存性能
調整一下參數
mapreduce.reduce.shuffle.merge.percent=0.4
mapreduce.reduce.shuffle.parallelcopies=5
mapreduce.reduce.shuffle.input.buffer.percent=0.6
mapreduce.reduce.shuffle.memory.limit.percent=0.17
shuffle任然要4G內存。感受shuffle.memory.limit.percent沒有起到做用優化
若是是物理內存溢出,須要調整mapreduce.reduce.memory.mb參數,默認是1024,spa
若是是虛擬內存溢出,須要調整yarn.nodemanager.vmem-pmem-ratio,默認是2.1,調大便可,
或者直接不限制虛擬內存,即yarn.nodemanager.vmem-check-enabled置爲false(在yarn-site.xml中,默認是true),
物理內存也能夠不檢查,將yarn.nodemanager.pmem-check-enabled置爲false(默認是true)。
每次處理100G左右的數據,可是程序一運行,CPU使用率會達到100%,直到任務結束,內存使用不會達到最大。在NodeMangager機器上,使用jps命令查看,會發現有8個YarnChild進程,是否能夠經過更改配置文件來減小YarnChild進程數量,來達到減小CPU佔用。
有幾種方法,一種是使用多租戶資源調度器,好比fairscheduler,capacity scheduler,配置多類型資源調度功能,這樣,你可使用參數mapreduce.map.cpu.vcores和mapreduce.reduce.cpu.vcores指定每一個任務使用的CPU數目,默認是1個,另外,默認只支持內存調度,你能夠經過參數mapreduce.map.memory.mb和mapreduce.reduce.memory.mb增大任務的內存使用量,減小一個節點上的併發任務數目
若是你配置了yarn.nodemanager.resource.memory-mb這個配置項,你把值改大些,或者直接就用默認的而後再根據須要去調整
問題的緣由起於對於懸掛的task,若是NMr在一段時間(默認是10min,能夠經過mapred.task.timeout屬性值來設置,單位是毫秒)內一直沒有收到它的進度報告,則把它標記爲失效
###########################################
MapReduce優化
優化(1)資源相關參數:
如下參數是在本身的 MapReduce 應用程序中配置就能夠生效
mapreduce.map.memory.mb: 一個 Map Task 可以使用的內存上限(單位:MB),默認爲 1024。若是 Map Task 實際使用的資源量超過該值,則會被強制殺死。
mapreduce.reduce.memory.mb: 一個 Reduce Task 可以使用的資源上限(單位:MB),默認爲 1024。若是 Reduce Task 實際使用的資源量超過該值,則會被強制殺死。
mapreduce.map.cpu.vcores: 每一個 Maptask 可用的最多 cpu core 數目, 默認值: 1
mapreduce.reduce.cpu.vcores: 每一個 Reducetask 可用最多 cpu core 數目默認值: 1
mapreduce.map.java.opts: Map Task 的 JVM 參數,你能夠在此配置默認的 java heap size 等參數, 例如:「-Xmx1024m -verbose:gc -Xloggc:/tmp/@taskid@.gc」
(@taskid@會被 Hadoop 框架自動換爲相應的 taskid), 默認值: 「」
mapreduce.reduce.java.opts: Reduce Task 的 JVM 參數,你能夠在此配置默認的 java heap size 等參數, 例如:「-Xmx1024m -verbose:gc -Xloggc:/tmp/@taskid@.gc」, 默認值: 「」
應該在 yarn 啓動以前就配置在服務器的配置文件中才能生效
yarn.scheduler.minimum-allocation-mb RM 中每一個容器請求的最小配置,以 MB 爲單位,默認 1024。
yarn.scheduler.maximum-allocation-mb RM 中每一個容器請求的最大分配,以 MB 爲單位,默認 8192。
yarn.scheduler.minimum-allocation-vcores 1
yarn.scheduler.maximum-allocation-vcores 32
yarn.nodemanager.resource.memory-mb 表示該節點上YARN可以使用的物理內存總量,默認是 8192(MB),注意,若是你的節點內存資源不夠 8GB,則須要調減少這個值,而 YARN不會智能的探測節點的物理內存總量。
shuffle 性能優化的關鍵參數,應在 yarn 啓動以前就配置好
mapreduce.task.io.sort.mb 100 shuffle 的環形緩衝區大小,默認 100m
mapreduce.map.sort.spill.percent 0.8 環形緩衝區溢出的閾值,默認 80%
優化(2)容錯相關參數:
mapreduce.map.maxattempts: 每一個 Map Task 最大重試次數,一旦重試參數超過該值,則認爲 Map Task 運行失敗,默認值:4。
mapreduce.reduce.maxattempts: 每一個Reduce Task最大重試次數,一旦重試參數超過該值,則認爲 Map Task 運行失敗,默認值:4。
mapreduce.map.failures.maxpercent: 當失敗的 Map Task 失敗比例超過該值,整個做業則失敗,默認值爲 0. 若是你的應用程序容許丟棄部分輸入數據,則該該值設爲一個大於 0 的值,好比 5,表示若是有低於 5%的 Map Task 失敗(若是一個 Map Task 重試次數超過mapreduce.map.maxattempts,則認爲這個 Map Task 失敗,其對應的輸入數據將不會產生任何結果),整個做業扔認爲成功。
mapreduce.reduce.failures.maxpercent: 當失敗的 Reduce Task 失敗比例超過該值爲,整個做業則失敗,默認值爲 0.
mapreduce.task.timeout:若是一個task在必定時間內沒有任何進入,即不會讀取新的數據,也沒有輸出數據,則認爲該 task 處於 block 狀態,多是臨時卡住,也許永遠會卡住。爲了防止由於用戶程序永遠 block 不退出,則強制設置了一個超時時間(單位毫秒),默認是600000,值爲 0 將禁用超時。
優化(3)效率跟穩定性參數(任務的推測執行):
Straggle(掉隊者)是指那些跑的很慢但最終會成功完成的任務。一個掉隊的Map任務會阻止Reduce任務開始執行。
Hadoop不能自動糾正掉隊任務,可是能夠識別那些跑的比較慢的任務,而後它會產生另外一個等效的任務做爲備份,並使用首先完成的那個任務的結果,此時另一個任務則會被要求中止執行。這種技術稱爲推測執行(speculative execution)。
默認使用推測執行。
屬性 描述
mapreduce.map.speculative 控制Map任務的推測執行(默認true)
mapreduce.reduce.speculative 控制Reduce任務的推測執行(默認true)
mapreduce.job.speculative.speculativecap 推測執行功能的任務可以佔總任務數量的比例(默認0.1,範圍0~1)
mapreduce.job.speculative.slownodethreshold 判斷某個TaskTracker是否適合啓動某個task的speculative task(默認1)
mapreduce.job.speculative.slowtaskthreshold 判斷某個task是否能夠啓動speculative task(默認1)
mapreduce.input.fileinputformat.split.minsize FileInputFormat作切片時最小切片大小,默認 1。
mapreduce.input.fileinputformat.split.maxsize FileInputFormat作切片時最大切片大小