mapreduce 程式效率取決於以下幾點:
1.計算機效能
cpu、記憶體、磁碟健康、網路
2.i/o 操作優化
(1)資料傾斜
(2)map 和 reduce 數設定不合理
(3)map 執行時間太長,導致 reduce 等待過久
(4)小檔案過多
(5)大量的不可分塊的超大檔案
(6)spill 次數過多
(7)merge 次數過多等。
1.資料輸入:
合併小檔案:在執行 mr 任務前將小檔案進行合併,大量的小檔案會產生大量的 map 任務,增大 map 任務裝載次數,而任務的裝載
比較耗時,從而導致mr 執行較慢
2.map階段:
(1)減少溢寫(spill)次數:通過調整 io.sort.mb 及 sort.spill.percent引數值,增大觸發 spill 的記憶體上限,減少 spill 次數,從而減少磁碟 io。
(2)減少合併(merge)次數:通過調整 io.sort.factor 引數,增大 merge 的檔案數目,減少 merge 的次數,從而縮短 mr 處理時間。
(3)在 map 之後,不影響業務邏輯前提下,先進行 combine 處理,減少 i/o。
3.reduce階段:
(1)合理設定 map 和 reduce 數:兩個都不能設定太少,也不能設定太多。太少,會導致 task 等待,延長處理時間;太多,會導致 map、reduce 任務間競爭資源,造成處理超時等錯誤
(2)設定 map、reduce 共存:調整 slowstart.completedmaps 引數,使 map 執行到一定程度後,reduce 也開始執行,減少 reduce 的等待時間。
(3)使用 reduce:因為 reduce 在用於蒐集資料集的時候將會產生大量的網路消耗。
(4)合理設定 reduce 端的 buffer:預設情況下,資料達到乙個閾值的時候,buffer中的資料就會寫入磁碟,然後 reduce 會從磁碟中獲得所有的資料。也就是說,buffer 和 reduce 是沒有直接關聯的,中間多個乙個寫磁碟->讀磁碟的過程,既然有這個弊端,那麼就可以通過引數置使得 buffer 中的一部分資料可以直接輸送到 reduce,從而減少 io 開銷:mapred.job.reduce.input.buffer.percent,預設為 0.0。當值大於 0 時候,會保留指定比例的記憶體讀 buffer 中的資料直接拿給reduce 使用。這樣一來,設定 buffer 需要記憶體,讀取資料需要記憶體,reduce 計算
也要記憶體,所以要根據作業的運**況進行調整。
4.資料傾斜問題
(1)資料傾斜現象
資料頻率傾斜——某乙個區域的資料量要遠遠大於其他區域。
資料大小傾斜——部分記錄的大小遠遠大於平均值。
(2)如何收集傾斜資料
在 reduce 方法中加入記錄 map 輸出鍵的詳細情況的功能。
public
static
final string max_values =
"skew.maxvalues"
;private
int maxvaluethreshold;
@override
public
void
configure
(jobconf job)
@override
public
void
reduce
(text key, iterator
values,
outputcollector
output,
reporter reporter)
throws ioexception if(
++i > maxvaluethreshold)
}
(3)減少資料傾斜的方法
①抽樣和範圍分割槽
可以通過對原始資料進行抽樣得到的結果集來預設分割槽邊界值。
②自定義分割槽
基於輸出鍵的背景知識進行自定義分割槽。例如,如果 map 輸出鍵的單詞**於一本書。且其中某幾個專業詞彙較多。那麼就可以自定義分割槽將這這些專業詞彙傳送給固定的一部分reduce 例項。而將其他的都傳送給剩餘的 reduce 例項。
③combine
使用 combine 可以大量地減小資料傾斜。在可能的情況下,combine 的目的就是提前聚合並精簡資料。
④採用 map join,盡量避免 reduce join。
1.資源相關引數:
(1)以下引數是在使用者自己的 mr 應用程式中配置就可以生效(mapred-default.xml)。
①mapreduce.map.memory.mb
乙個 map task 可使用的資源上限(單位:mb),預設為 1024。如果 map task實際使用的資源量超過該值,則會被強制殺死。
②mapreduce.reduce.memory.mb
乙個 reduce task 可使用的資源上限(單位:mb),預設為 1024。如果reduce task實際使用的資源量超過該值,則會被強制殺死。
③mapreduce.map.cpu.vcores
每個 map task 可使用的最多 cpu core數目,預設值: 1
④mapreduce.reduce.cpu.vcores
每個 reduce task 可使用的最多 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)。
①yarn.scheduler.minimum-allocation-mb 1024
給應用程式 container 分配的最小記憶體
②yarn.scheduler.maximum-allocation-mb 8192
給應用程式 container 分配的最大記憶體
③yarn.scheduler.minimum-allocation-vcores 1
每個 container 申請的最小 cpu 核 數
④yarn.scheduler.maximum-allocation-vcores 32
每個 container 申請的最大 cpu 核 數
⑤yarn.nodemanager.resource.memory-mb 8192
給 containers 分配的最大物理記憶體
(3)shuffle 效能優化的關鍵引數,應在 yarn 啟動之前就配置好(mapred-default.xml)。
①mapreduce.task.io.sort.mb 100
shuffle 的環形緩衝區大小,預設100m
②mapreduce.map.sort.spill.percent 0.8
環形緩衝區溢位的閾值,預設80%
2.容錯相關引數配置(mapreduce效能優化)
(1)mapreduce.map.maxattempts
每個 map task 最大重試次數,一旦重試引數超過該值,則認為 map task 執行失敗,預設值:4。
(2)mapreduce.reduce.maxattempts
每個 reduce task 最大重試次數,一旦重試引數超過該值,則認為 map task 執行失敗,預設值:4。
(3)mapreduce.task.timeout
task 超時時間,經常需要設定的乙個引數,該引數表達的意思為:如果乙個 task 在一定時間內沒
有任何進入,即不會讀取新的資料,也沒有輸出資料,則認為該 task 處於 block 狀態,可能是卡
住了,也許永遠會卡主,為了防止因為使用者程式永遠 block 住不退出,則強制設定了乙個該超時
時間(單位毫秒),預設是 600000。
MapReduce的優化方法
從以下6個方面著手考慮 map端資料輸入時主要需要考慮的是小檔案 因為hadoop預設的切片原則是按檔案進行的 的問題 針對小檔案的問題我們有如下兩種解決方案 1 合併小檔案 在map讀取資料任務開始前,可以人工的對小檔案進行乙個合併,合併成乙個大檔案。2 採用combinetextinputfor...
大資料優化方案 MapReduce優化方法
無意中發現了乙個巨牛的人工智慧教程,忍不住分享一下給大家。教程不僅是零基礎,通俗易懂,而且非常風趣幽默,像看 一樣!覺得太牛了,所以分享給大家。點這裡可以跳轉到教程。大資料面試寶典目錄,一 mapreduce 程式效率的瓶頸在於兩點 1 計算機效能 cpu 記憶體 磁碟健康 網路 2 i o 操作優...
mapreduce優化方案
1.任務排程 任務排程是hadoop中重要的環節 1.計算方面,hadoop會將任務分配給空閒機器,使所有的任務能公平地分享系統資源。2.i o資料流方面,會盡量將map任務分配給inputsplit所在的機器,減少i o操作。2.資料預處理與inputsplit的大小 1.mapredue適合處理...