1. 程式人生 > >MapReduce優化方法總結

MapReduce優化方法總結

1 MapReduce 跑的慢的原因

2 MapReduce優化方法

MapReduce優化方法主要從六個方面考慮:資料輸入、Map階段、Reduce階段、IO傳輸、資料傾斜問題和常用的調優引數。

1 資料輸入

2 Map階段

3 Reduce階段



4 I/O傳輸

5 資料傾斜問題

 

6 常用的調優引數

1.資源相關引數

(1)以下引數是在使用者自己的MR應用程式中配置就可以生效(mapred-default.xml)

表4-12

配置引數

引數說明

mapreduce.map.memory.mb

一個MapTask可使用的資源上限(單位:MB),預設為1024。如果MapTask實際使用的資源量超過該值,則會被強制殺死。

mapreduce.reduce.memory.mb

一個ReduceTask可使用的資源上限(單位:MB),預設為1024。如果ReduceTask實際使用的資源量超過該值,則會被強制殺死。

mapreduce.map.cpu.vcores

每個MapTask可使用的最多cpu core數目,預設值: 1

mapreduce.reduce.cpu.vcores

每個ReduceTask可使用的最多cpu core數目,預設值: 1

mapreduce.reduce.shuffle.parallelcopies

每個Reduce去Map中取資料的並行數。預設值是5

mapreduce.reduce.shuffle.merge.percent

Buffer中的資料達到多少比例開始寫入磁碟。預設值0.66

mapreduce.reduce.shuffle.input.buffer.percent

Buffer大小佔Reduce可用記憶體的比例。預設值0.7

mapreduce.reduce.input.buffer.percent

指定多少比例的記憶體用來存放Buffer中的資料,預設值是0.0

(2)應該在YARN啟動之前就配置在伺服器的配置檔案中才能生效(yarn-default.xml)

表4-13

配置引數

引數說明

yarn.scheduler.minimum-allocation-mb  

給應用程式Container分配的最小記憶體,預設值:1024

yarn.scheduler.maximum-allocation-mb          

給應用程式Container分配的最大記憶體,預設值:8192

yarn.scheduler.minimum-allocation-vcores   

每個Container申請的最小CPU核數,預設值:1

yarn.scheduler.maximum-allocation-vcores  

每個Container申請的最大CPU核數,預設值:32

yarn.nodemanager.resource.memory-mb  

給Containers分配的最大實體記憶體,預設值:8192

(3)Shuffle效能優化的關鍵引數,應在YARN啟動之前就配置好(mapred-default.xml)

表4-14

配置引數

引數說明

mapreduce.task.io.sort.mb  

Shuffle的環形緩衝區大小,預設100m

mapreduce.map.sort.spill.percent  

環形緩衝區溢位的閾值,預設80%

2.容錯相關引數(MapReduce效能優化)

表4-15

配置引數

引數說明

mapreduce.map.maxattempts

每個Map Task最大重試次數,一旦重試引數超過該值,則認為Map Task執行失敗,預設值:4。

mapreduce.reduce.maxattempts

每個Reduce Task最大重試次數,一旦重試引數超過該值,則認為Map Task執行失敗,預設值:4。

mapreduce.task.timeout

Task超時時間,經常需要設定的一個引數,該引數表達的意思為:如果一個Task在一定時間內沒有任何進入,即不會讀取新的資料,也沒有輸出資料,則認為該Task處於Block狀態,可能是卡住了,也許永遠會卡住,為了防止因為使用者程式永遠Block住不退出,則強制設定了一個該超時時間(單位毫秒),預設是600000。如果你的程式對每條輸入資料的處理時間過長(比如會訪問資料庫,通過網路拉取資料等),建議將該引數調大,該引數過小常出現的錯誤提示是“AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by the ApplicationMaster.”。